sql >> Databasteknik >  >> RDS >> Sqlserver

CASE (Innehåller) snarare än lika påstående

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

Den ledande ', ' och efterföljande ',' läggs till så att du kan hantera matchningen oavsett var den är i strängen (första posten, sista posten eller någonstans däremellan).

Som sagt, varför lagrar du data du vill söka på som en kommaseparerad sträng? Detta bryter mot alla typer av former och bästa praxis. Du bör överväga att normalisera ditt schema.

Dessutom:använd inte 'single quotes' som identifierare avgränsare; denna syntax är utfasad. Använd [square brackets] (föredraget) eller "double quotes" om du måste. Se "strängbokstavar som kolumnalias" här:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

REDIGERA Om du har flera värden kan du göra detta (du kan inte förkorta detta med den andra CASE syntaxvariant eller genom att använda något som IN() ):

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

Om du har fler värden kan det vara värt att använda en delad funktion, t.ex.

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

Resultat:

ID
----
1
2
4


  1. lagra långa värden i Android-databasen

  2. SQLAlchemy, serialiserbara transaktionsisolering och återförsök på idiomatiskt Python-sätt

  3. Använd Wicket för att visa en bild lagrad som BLOB i MYSQL db

  4. Mysql - välj från flera tabeller utan att producera dubbletter av data