22

caseステートメントでequalではなくcontainを使用する方法はありますか?

たとえば、データベーステーブルにエントリがあることを確認しています

lactulose, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline, 

使ってもいいですか

CASE When dbo.Table.Column = 'lactulose' Then 'BP Medication' ELSE '' END AS 'BP Medication'

これは機能しませんでした。

前もって感謝します

4

2 に答える 2

34
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
于 2012-05-16T00:05:34.537 に答える
6

擬似コード、次のようなもの:

CASE
  When CHARINDEX('lactulose', dbo.Table.Column) > 0 Then 'BP Medication'
ELSE ''
END AS 'Medication Type'

これは、キーワードがリストのどこにあるかを気にせず、スペースとコンマのフォーマットに依存することを回避します。

于 2012-05-16T00:19:05.623 に答える