Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

CASE (Contient) plutôt qu'une déclaration égale

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

Le premier ', ' et ',' à la fin sont ajoutés afin que vous puissiez gérer la correspondance quel que soit son emplacement dans la chaîne (première entrée, dernière entrée ou n'importe où entre les deux).

Cela dit, pourquoi stockez-vous les données que vous souhaitez rechercher sous forme de chaîne séparée par des virgules ? Cela viole toutes sortes de formulaires et de bonnes pratiques. Vous devriez envisager de normaliser votre schéma.

De plus :n'utilisez pas de 'single quotes' comme délimiteurs d'identifiant ; cette syntaxe est obsolète. Utilisez [square brackets] (de préférence) ou "double quotes" si tu dois. Voir "littéraux de chaîne comme alias de colonne" ici :http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

MODIFIER Si vous avez plusieurs valeurs, vous pouvez le faire (vous ne pouvez pas raccourcir cela avec l'autre CASE variante de syntaxe ou en utilisant quelque chose comme IN() ):

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

Si vous avez plus de valeurs, il peut être intéressant d'utiliser une fonction de fractionnement, par exemple

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

Résultats :

ID
----
1
2
4