CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' THEN 'BP Medication' ELSE '' END AS [BP Medication]
プレ>先頭の
', '
および末尾の','
文字列のどこにあるか (最初のエントリ、最後のエントリ、またはその間の任意の場所) に関係なく、一致を処理できるように追加されます。とはいえ、検索したいデータをコンマ区切りの文字列として保存するのはなぜですか?これは、あらゆる種類のフォームとベスト プラクティスに違反しています。スキーマの正規化を検討する必要があります。
さらに:
'single quotes'
は使用しないでください。 識別子の区切り記号として。この構文は非推奨です。[square brackets]
を使用してください (推奨) または"double quotes"
あなたがしなければならない場合。こちらの「列エイリアスとしての文字列リテラル」を参照してください:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx編集 複数の値がある場合は、これを行うことができます (他の
CASE
でこれを短縮することはできません) 構文バリアントまたはIN()
のようなものを使用して ):CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' WHEN ', ' + dbo.Table.Column +',' LIKE '%, amlodipine,%' THEN 'BP Medication' ELSE '' END AS [BP Medication]
プレ>より多くの値がある場合は、分割関数を使用する価値があるかもしれません。例:
USE tempdb; GO CREATE FUNCTION dbo.SplitStrings(@List NVARCHAR(MAX)) RETURNS TABLE AS RETURN ( SELECT DISTINCT Item FROM ( SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)') FROM ( SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List,',', '</i><i>') + '</i>').query('.') ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y WHERE Item IS NOT NULL ); GO CREATE TABLE dbo.[Table](ID INT, [Column] VARCHAR(255)); GO INSERT dbo.[Table] VALUES (1,'lactulose, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline,'), (2,'lactulite, Lasix (furosemide), lactulose, propranolol, rabeprazole, sertraline,'), (3,'lactulite, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline,'), (4,'lactulite, Lasix (furosemide), lactulose, amlodipine, rabeprazole, sertraline,'); SELECT t.ID FROM dbo.[Table] AS t INNER JOIN dbo.SplitStrings('lactulose,amlodipine') AS s ON ', ' + t.[Column] + ',' LIKE '%, ' + s.Item + ',%' GROUP BY t.ID; GO
プレ>結果:
ID ---- 1 2 4
プレ>