Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

CASE (Berisi) daripada pernyataan yang sama

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

', ' dan mengikuti ',' ditambahkan sehingga Anda dapat menangani kecocokan di mana pun ia berada dalam string (entri pertama, entri terakhir, atau di mana pun di antaranya).

Yang mengatakan, mengapa Anda menyimpan data yang ingin Anda cari sebagai string yang dipisahkan koma? Ini melanggar semua jenis formulir dan praktik terbaik. Anda harus mempertimbangkan untuk menormalkan skema Anda.

Selain itu:jangan gunakan 'single quotes' sebagai pembatas pengenal; sintaks ini tidak digunakan lagi. Gunakan [square brackets] (lebih disukai) atau "double quotes" jika kamu harus. Lihat "literal string sebagai alias kolom" di sini:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

EDIT Jika Anda memiliki beberapa nilai, Anda dapat melakukan ini (Anda tidak dapat mempersingkatnya dengan CASE lainnya varian sintaks atau dengan menggunakan sesuatu seperti IN() ):

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

Jika Anda memiliki lebih banyak nilai, mungkin ada baiknya menggunakan fungsi split, mis.

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

Hasil:

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. Pertumbuhan Ukuran Database SQL Server menggunakan riwayat Cadangan

  2. Cara Mengganti Nama Batasan Kunci Utama untuk Beberapa Tabel di Database SQL Server - Tutorial SQL Server / TSQL Bagian 64

  3. Bisakah kita meneruskan parameter ke tampilan di SQL?

  4. Bisakah pemicu SQL CLR melakukan ini? Atau ada cara yang lebih baik?

  5. PHP, ORM, MSSQL dan Unicode, apakah mungkin untuk membuat ini bekerja bersama?