sql >> Databáze >  >> RDS >> Sqlserver

CASE (Obsahuje) spíše než rovné prohlášení

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

První ', ' a koncové ',' jsou přidány, abyste mohli zpracovat shodu bez ohledu na to, kde se v řetězci nachází (první položka, poslední položka nebo kdekoli mezi nimi).

Proč tedy ukládáte data, která chcete prohledávat, jako řetězec oddělený čárkami? To porušuje všechny druhy forem a osvědčených postupů. Měli byste zvážit normalizaci schématu.

Navíc:nepoužívejte 'single quotes' jako oddělovače identifikátorů; tato syntaxe je zastaralá. Použijte [square brackets] (preferováno) nebo "double quotes" když musíš. Viz „řetězcové literály jako aliasy sloupců“ zde:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

UPRAVIT Pokud máte více hodnot, můžete to udělat (nemůžete to zkrátit s druhým CASE variantu syntaxe nebo pomocí něčeho jako IN() ):

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

Pokud máte více hodnot, mohlo by být užitečné použít funkci rozdělení, např.

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

Výsledky:

ID
----
1
2
4


  1. MySQL Pomalé připojení – ale ne vždy a ne na všech stolech

  2. Geo vzdálenost MySQL

  3. Jak používat více databází v Laravelu

  4. MySQL seskupí se 2 sloupci, když se hodnoty ve sloupcích zaměňují