在case语句中是否有使用包含而不是相等的方法?
例如,我正在检查一个数据库表是否有一个条目
lactulose, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline,
我可以用吗
CASE When dbo.Table.Column = 'lactulose' Then 'BP Medication' ELSE '' END AS 'BP Medication'
这没有用。
提前致谢
在case语句中是否有使用包含而不是相等的方法?
例如,我正在检查一个数据库表是否有一个条目
lactulose, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline,
我可以用吗
CASE When dbo.Table.Column = 'lactulose' Then 'BP Medication' ELSE '' END AS 'BP Medication'
这没有用。
提前致谢
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
伪代码,例如:
CASE
When CHARINDEX('lactulose', dbo.Table.Column) > 0 Then 'BP Medication'
ELSE ''
END AS 'Medication Type'
这不关心关键字在列表中的位置,并避免依赖于空格和逗号的格式。