sql >> Database teknologi >  >> RDS >> Sqlserver

CASE (Indeholder) snarere end ligestillet udsagn

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

Den førende ', ' og efterfølgende ',' tilføjes, så du kan håndtere matchen uanset hvor den er i strengen (første indtastning, sidste indtastning eller hvor som helst midt imellem).

Når det er sagt, hvorfor gemmer du data, du vil søge på, som en kommasepareret streng? Dette overtræder alle former for former og bedste praksis. Du bør overveje at normalisere dit skema.

Derudover:Brug ikke 'single quotes' som identifikatorafgrænsere; denne syntaks er forældet. Brug [square brackets] (foretrukket) eller "double quotes" hvis du skal. Se "streng literals som kolonnealiaser" her:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

REDIGER Hvis du har flere værdier, kan du gøre dette (du kan ikke forkorte dette med den anden CASE syntaksvariant eller ved at bruge noget som IN() ):

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

Hvis du har flere værdier, kan det betale sig at bruge en splitfunktion, f.eks.

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

Resultater:

ID
----
1
2
4


  1. PHP/MYSQL Hent navn baseret på et andet kriterium

  2. MySQL dynamisk krydstabuleringsforespørgsel:Valg af underordnede poster som yderligere kolonner

  3. Ti tips til at gå i produktion med PostgreSQL

  4. Opret intervaller af minutter (15) i vælg