Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

CASE (Chứa) chứ không phải là câu lệnh bình đẳng

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

', ' hàng đầu và dấu ', ' được thêm vào để bạn có thể xử lý đối sánh bất kể nó nằm ở đâu trong chuỗi (mục nhập đầu tiên, mục nhập cuối cùng hoặc bất kỳ vị trí nào ở giữa).

Điều đó nói lên rằng, tại sao bạn lại lưu trữ dữ liệu mà bạn muốn tìm kiếm dưới dạng một chuỗi được phân tách bằng dấu phẩy? Điều này vi phạm tất cả các loại biểu mẫu và thực tiễn tốt nhất. Bạn nên xem xét việc chuẩn hóa lược đồ của mình.

Ngoài ra:không sử dụng 'single quotes' làm dấu phân cách định danh; cú pháp này không được dùng nữa. Sử dụng [square brackets] (ưu tiên) hoặc "double quotes" nếu bạn phải. Xem "chuỗi ký tự dưới dạng bí danh cột" tại đây: http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

CHỈNH SỬA Nếu bạn có nhiều giá trị, bạn có thể làm điều này (bạn không thể sử dụng giá trị này với CASE khác biến thể cú pháp hoặc bằng cách sử dụng một cái gì đó như IN() ):

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

Nếu bạn có nhiều giá trị hơn, bạn nên sử dụng hàm phân tách, ví dụ:

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

Kết quả:

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. Cách xử lý-thoát cả dấu ngoặc kép và dấu ngoặc kép trong câu lệnh SQL-Update

  2. Cách cấu hình SQL Server để quản lý các phiên ASP.NET

  3. Cách SET ROWCOUNT hoạt động trong SQL Server

  4. Bảng tổng hợp SQL Server với nhiều cột tổng hợp

  5. Làm cách nào để tạo một ràng buộc duy nhất cũng cho phép null?