Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

CASE (Enthält) statt Equal-Anweisung

CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' 
  THEN 'BP Medication' ELSE '' END AS [BP Medication]

Der führende ', ' und nachgestelltem ',' hinzugefügt, damit Sie die Übereinstimmung unabhängig davon behandeln können, wo sie sich in der Zeichenfolge befindet (erster Eintrag, letzter Eintrag oder irgendwo dazwischen).

Warum speichern Sie Daten, nach denen Sie suchen möchten, als kommagetrennte Zeichenfolge? Dies verstößt gegen alle Arten von Formularen und Best Practices. Sie sollten erwägen, Ihr Schema zu normalisieren.

Außerdem:Verwenden Sie keine 'single quotes' als Bezeichner-Trennzeichen; diese Syntax ist veraltet. Verwenden Sie [square brackets] (bevorzugt) oder "double quotes" wenn du musst. Siehe "String-Literale als Spaltenaliase" hier:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

BEARBEITEN Wenn Sie mehrere Werte haben, können Sie dies tun (Sie können dies nicht mit dem anderen CASE abkürzen Syntaxvariante oder indem Sie 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 mehr Werte haben, kann es sich lohnen, eine Split-Funktion zu verwenden, z. B.

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