Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

CASE (contém) em vez de declaração igual

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

O ', ' principal e ',' à direita são adicionados para que você possa lidar com a correspondência independentemente de onde ela esteja na string (primeira entrada, última entrada ou em qualquer lugar entre elas).

Dito isso, por que você está armazenando os dados que deseja pesquisar como uma string separada por vírgulas? Isso viola todos os tipos de formulários e práticas recomendadas. Você deve considerar normalizar seu esquema.

Além disso:não use 'single quotes' como delimitadores de identificadores; esta sintaxe está obsoleta. Use [square brackets] (preferencial) ou "double quotes" se você deve. Consulte "literais de string como aliases de coluna" aqui:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

EDITAR Se você tiver vários valores, você pode fazer isso (você não pode abreviar isso com o outro CASE variante de sintaxe ou usando algo como IN() ):
CASE 
  WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' 
  WHEN ', ' + dbo.Table.Column +',' LIKE '%, amlodipine,%' 
  THEN 'BP Medication' ELSE '' END AS [BP Medication]

Se você tiver mais valores, pode valer a pena usar uma função de divisão, por exemplo
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

Resultados:
ID
----
1
2
4