Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

CASE (съдържа), а не равенство

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

Водещият ', ' и завършващи ',' се добавят, така че да можете да обработите съвпадението, независимо къде е в низа (първи запис, последен запис или някъде между тях).

Въпреки това, защо съхранявате данните, които искате да търсите, като низ, разделен със запетаи? Това нарушава всякакви форми и най-добри практики. Трябва да помислите за нормализиране на вашата схема.

В допълнение:не използвайте 'single quotes' като разделители на идентификатори; този синтаксис е остарял. Използвайте [square brackets] (за предпочитане) или "double quotes" ако трябва. Вижте „низови литерали като псевдоними на колони“ тук:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

РЕДАКТИРАНЕ Ако имате няколко стойности, можете да направите това (не можете да съкратите това с другия CASE синтактичен вариант или като използвате нещо като IN() ):

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

Ако имате повече стойности, може да си струва да използвате функция за разделяне, напр.

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

Резултати:

ID
----
1
2
4


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 типа данни, които да бъдат оттеглени в SQL Server

  2. JSON_QUERY() срещу JSON_VALUE() в SQL Server:Каква е разликата?

  3. Писане на кирилица в SQL Server '?????'

  4. Изчислете разликата във времето между два реда

  5. Създайте разделена таблица в SQL Server (T-SQL)