CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%'
THEN 'BP Medication' ELSE '' END AS [BP Medication]
Die führenden ', '
und ','
nachlauf hinzugefügt werden, so dass Sie das Spiel umgehen können, unabhängig davon, wo es in der Zeichenfolge (erster Eintrag, letzter Eintrag, oder irgendwo dazwischen).
Das heißt, warum speichern Sie Daten, die Sie durchsuchen möchten, als eine durch Komma getrennte Zeichenfolge? Dies verletzt alle Arten von Formen und Best Practices. Sie sollten in Betracht ziehen, Ihr Schema zu normalisieren.
Zusätzlich: 'single quotes'
nicht als Bezeichnertrennzeichen verwenden; Diese Syntax ist veraltet. Verwenden Sie (bevorzugt) oder "double quotes"
, wenn Sie müssen. Siehe „Stringliterale als Spaltenaliasnamen“ hier: http://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx
EDIT Wenn Sie mehrere Werte haben, können Sie dies tun (man kann nicht kurz Hand dies mit der anderen CASE
Syntaxvariante oder durch so etwas wie IN()
verwenden) :
CASE
WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%'
WHEN ', ' + dbo.Table.Column +',' LIKE '%, amlodipine,%'
THEN 'BP Medication' ELSE '' END AS [BP Medication]
Wenn Sie mehrere Werte haben, kann es sinnvoll sein, eine Split-Funktion zu verwenden, z
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
Ergebnisse:
ID
----
1
2
4
Das klappt super, danke für den Hinweis zur Normalisierung, wird reichen. Gibt es eine Möglichkeit, der Anweisung OR hinzuzufügen, zum Beispiel LIKE '%, Lactulose,%' ODER '% Amlodipin%'. Nochmals vielen Dank – hncl
Ja, nur CASE WENN ... WIE ... ODER ... WIE ... Sie können es nicht tun, ohne den ersten Ausdruck zu wiederholen. Ich werde später ein Beispiel veröffentlichen, das sich mit mehreren Werten befasst. –
Danke Aaron, das ist sehr hilfreich. – hncl