CASE(包含)而不是平等的陈述

hnc*_*ncl 16 sql-server sql-server-2008

是否有一种方法可以使用包含而不是相等的case语句?

例如,我正在检查数据库表是否有条目

lactulose, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline, 
Run Code Online (Sandbox Code Playgroud)

我可以用吗

CASE When dbo.Table.Column = 'lactulose' Then 'BP Medication' ELSE '' END AS 'BP Medication'
Run Code Online (Sandbox Code Playgroud)

这没用.

提前致谢

Aar*_*and 24

CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' 
  THEN 'BP Medication' ELSE '' END AS [BP Medication]
Run Code Online (Sandbox Code Playgroud)

添加前导', '和尾随',',以便您可以处理匹配,无论它在字符串中的位置(第一个条目,最后一个条目或其间的任何位置).

也就是说,为什么要将要搜索的数据存储为以逗号分隔的字符串?这违反了各种形式和最佳做法.您应该考虑规范化架构.

另外:不要'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]
Run Code Online (Sandbox Code Playgroud)

如果你有更多的值,那么使用split函数可能是值得的,例如

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
Run Code Online (Sandbox Code Playgroud)

结果:

ID
----
1
2
4
Run Code Online (Sandbox Code Playgroud)


Bil*_*lbo 5

伪代码,类似于:

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

这并不关心在列表中找到关键字的位置,并且避免了取决于空格和逗号的格式。