FOR XML PATHでそれを行います。
VALUES の代わりに共用体 (UNION ALL) を使用できます。これには、SQL-Server 2005 で引き続き機能するという付加価値があり (当社ではまだサポートする必要があります)、NULL 値を削除できます。
DECLARE @in_SearchTerm1 nvarchar(100)
DECLARE @in_SearchTerm2 nvarchar(100)
DECLARE @in_SearchTerm3 nvarchar(100)
DECLARE @in_SearchTerm4 nvarchar(100)
SET @in_SearchTerm1 = N'a'
SET @in_SearchTerm2 = N''
SET @in_SearchTerm3 = N'c'
SET @in_SearchTerm4 = N''
SELECT
COALESCE
(
STUFF
(
(
SELECT ' / ' + RPT_SearchTerm AS [text()]
FROM
(
SELECT NULLIF(@in_SearchTerm1, N'') AS RPT_SearchTerm, 1 AS RPT_Sort
UNION ALL SELECT NULLIF(@in_SearchTerm2, N'') AS RPT_SearchTerm, 2 AS RPT_Sort
UNION ALL SELECT NULLIF(@in_SearchTerm3, N'') AS RPT_SearchTerm, 3 AS RPT_Sort
UNION ALL SELECT NULLIF(@in_SearchTerm4, N'') AS RPT_SearchTerm, 4 AS RPT_Sort
) AS tempT
WHERE RPT_SearchTerm IS NOT NULL
ORDER BY RPT_Sort
FOR XML PATH(N''), TYPE
).value('.', 'nvarchar(MAX)')
,1
,3
,N''
)
,N''
) AS RPT_SearchTerms
nvarchar の使用に注意してください - すでに varchar の使用をやめてください。
また、順序を維持するために、注文する必要があります。
それで、これは何をしますか:
目標:
レポートの 4 つの個別のフィルターに入力された 4 つの検索語を取得します。
これらの 4 つの検索用語を で連結してレポートに表示し' / '
ます。検索語が空
の場合はありません。
これは、term4/term2/term3/term1 などではなく、term1/term2/term3/term4 のように順番に表示する必要があります。' / / '
方法:
4 つの検索用語を結合して、順序を保持するための並べ替え値を追加します。
和集合から検索語とセパレーターを選択します (separatur + null = null)
SELECT ' / ' + RPT_SearchTerm
FROM (UNION OF SEARCH TEMRS) AS tempT
RPT_Sort で並べ替える
ここで、tempT のすべての値 (区切り文字 + テキスト) を 1 つの XML ファイル ( FOR XML
) に選択します。ここで、すべての値は空のタグ名を持つ XML 要素( ) でPATH(N'')
あり、値 XML テキスト ( AS [text()]
) (別名 element.innerXML) を選択します。
その結果を XML 要素 ( TYPE
) として取得し、その XML 要素 ( ) の innerText 文字列を取得します.value('.', 'nvarchar(MAX)')
(別名 XML デコード)。
最後に、先頭の「/」( STUFF(var, 1,3, N'')
)を削除します。
これは原理的には
CONCAT_WS(' / ', @in_SearchTerm1, @in_SearchTerm2, @in_SearchTerm3, @in_SearchTerm4)
nullif を追加します。
CONCAT_WS(' / ', NULLIF(@in_SearchTerm1, '') , NULLIF(@in_SearchTerm2, ''), NULLIF(@in_SearchTerm3, ''), NULLIF(@in_SearchTerm4, ''))
そしてあなたはそこにいます。
これは、SQL-ServerでCONCAT_WSを引き続き実行できる方法です...