Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

CASE (zawiera) zamiast równego stwierdzenia

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

Wiodący ', ' i końcowy ',' są dodawane, abyś mógł obsłużyć dopasowanie niezależnie od tego, gdzie się znajduje w ciągu (pierwszy wpis, ostatni wpis lub gdziekolwiek pomiędzy).

To powiedziawszy, dlaczego przechowujesz dane, które chcesz przeszukać, jako ciąg oddzielony przecinkami? Narusza to wszelkiego rodzaju formularze i najlepsze praktyki. Powinieneś rozważyć normalizację swojego schematu.

Ponadto:nie używaj 'single quotes' jako ograniczniki identyfikatora; ta składnia jest przestarzała. Użyj [square brackets] (preferowane) lub "double quotes" Jeśli musisz. Zobacz „litery ciągów jako aliasy kolumn” tutaj:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

EDYTUJ Jeśli masz wiele wartości, możesz to zrobić (nie możesz skrócić tego z innymi CASE wariantu składni lub za pomocą czegoś takiego jak IN() ):

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

Jeśli masz więcej wartości, warto użyć funkcji podziału, np.

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

Wyniki:

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. Jak działa funkcja SOUNDEX() serwera SQL?

  2. Znajdź najmniejszą nieużywaną liczbę w SQL Server

  3. Zapytanie do serwera połączonego Postgresql bardzo wolne

  4. SQL Server 2008 GET DATETIMEOFFSET zgodnie z ustawieniami maszyny

  5. Odwołanie do kursora programu SQL Server (składnia itp.)