テーブル変数からTagIdリストを取得し、リストを返す以下のクエリがあります。条件に基づいた条件の追加/スキップ
しかし、@Tagsにレコードがある場合のみ、そのCategoryId WHERE条件を追加する必要があります。
テーブル変数に1 = 1(常にtrue)の同じクエリを実行し、カテゴリフィルタをスキップするレコードがある場合のみWHERE条件を追加できますか?
DECLARE @TagIdList NVARCHAR(100) = '22,25,47'
DECLARE @Tags TABLE (TagId INT);
WITH CSVtoTable
AS (
SELECT CAST('<XMLRoot><RowData>' + REPLACE(t.val, ',', '</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM (
SELECT @TagIdList
) AS t(val)
)
INSERT INTO @Tags (TagId)
SELECT m.n.value('.[1]', 'varchar(8000)') AS TagId
FROM CSVtoTable
CROSS APPLY x.nodes('/XMLRoot/RowData') m(n)
SELECT BookingId
,C.CategoryName
FROM Booking B
INNER JOIN Category C ON C.CategoryId = B.CategoryId
WHERE (
b.IsDeleted = 0
OR b.IsDeleted IS NULL
)
-- Add the below where condition only if @Tags has records, else use 1=1
AND C.CategoryId IN (
SELECT DISTINCT CategoryId
FROM CategoryXTag con
WHERE TagId IN (
SELECT TagId
FROM @Tags
)
)
これは簡単に見えます – Developer