CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%'
THEN 'BP Medication' ELSE '' END AS [BP Medication]
El líder ', '
y posterior ','
se añaden para que pueda manejar el partido, independientemente de dónde se encuentra en la cadena (primera entrada, la última entrada, o en cualquier lugar en el medio).
Dicho esto, ¿por qué está almacenando los datos que desea buscar como una cadena separada por comas? Esto viola todo tipo de formas y mejores prácticas. Debería considerar normalizar su esquema.
Además: no utilice 'single quotes'
como delimitadores de identificador; esta sintaxis está en desuso. Use [square brackets]
(preferido) o "double quotes"
si es necesario. Consulte "literales de cadena como alias de columna" aquí: http://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx
EDITAR Si tiene varios valores, puede hacer esto (no se puede taquigrafía esto con la otra variante CASE
de sintaxis o mediante el uso de algo así como IN()
) :
CASE
WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%'
WHEN ', ' + dbo.Table.Column +',' LIKE '%, amlodipine,%'
THEN 'BP Medication' ELSE '' END AS [BP Medication]
Si tiene más valores, podría valer la pena utilizar una función dividida, por ejemplo
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
Esto funciona muy bien, gracias por los consejos sobre la normalización, va a hacer. ¿Hay alguna forma de agregar O a la instrucción, por ejemplo LIKE '%, lactulose,%' OR '% amlodipine%'. Gracias de nuevo – hncl
Sí solo CASE CUANDO ... COMO ... O ... ME GUSTA ... no puedes hacerlo sin repetir la primera expresión. Voy a publicar un ejemplo más adelante que trata con múltiples valores. –
Gracias Aaron, esto es muy útil. – hncl