CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%'
THEN 'BP Medication' ELSE '' END AS [BP Medication]
Il leader ', '
e finali ','
sono aggiunti in modo da poter gestire la partita indipendentemente da dove si trova nella stringa (prima voce, ultima voce, o dovunque nel fratempo).
Detto questo, perché si memorizzano i dati su cui si desidera eseguire la ricerca come stringa separata da virgole? Ciò viola tutti i tipi di forme e best practice. Dovresti considerare di normalizzare il tuo schema.
Inoltre: non utilizzare 'single quotes'
come delimitatori identificatori; questa sintassi è deprecata. Utilizzare [square brackets]
(preferito) o "double quotes"
se necessario. Vedere "stringhe letterali come alias di colonna" qui: http://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx
EDIT Se si dispone di più valori, si può fare questo (non è possibile a breve mano questo con l'altra variante CASE
sintassi o usando qualcosa come IN()
) :
CASE
WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%'
WHEN ', ' + dbo.Table.Column +',' LIKE '%, amlodipine,%'
THEN 'BP Medication' ELSE '' END AS [BP Medication]
Se si dispone di più valori, potrebbe essere utile utilizzare una funzione di divisione, ad es.
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
Risultati:
ID
----
1
2
4
Questo funziona benissimo, grazie per il consiglio sulla normalizzazione, lo farà. C'è un modo per aggiungere OR all'istruzione, ad esempio LIKE '%, lattulose,%' OR '% amlodipine%'. Grazie ancora – hncl
Sì, solo CASO QUANDO ... MI PIACE ... O ... MI PIACE ... non puoi farlo senza ripetere la prima espressione. Pubblicherò un esempio più tardi che si occupa di più valori. –
Grazie Aaron, questo è molto utile. – hncl