2011-12-15 21 views
10

Trong SQL, nếu bạn muốn thực hiện một SELECT với một ký tự đại diện, bạn muốn sử dụng:Làm thế nào để CHỌN bằng cách sử dụng cả hai ký tự đại diện (LIKE) và mảng (IN)?

SELECT * FROM table_name WHERE field_name LIKE '%value%' 

Nếu bạn muốn sử dụng một mảng các giá trị có thể, bạn muốn sử dụng:

SELECT * FROM table_name WHERE field_name IN ('one', 'two', 'three') 

Nhưng, bạn sẽ làm gì nếu bạn muốn sử dụng cả hai ký tự đại diện và một mảng?

Loại như:

SELECT * FROM table_name WHERE field_name LIKE IN ('%one', '_two', 'three[abv]') 
+0

Nếu bạn đang sử dụng MySQL, đây là bản sao có thể có: http: // s tackoverflow.com/questions/1127088/mysql-like-in –

+0

bản sao có thể có của [Sử dụng SQL LIKE và IN cùng nhau] (http://stackoverflow.com/questions/2318126/using-sql-like-and-in-together) – Ben

Trả lời

11
SELECT * 
FROM table_name 
WHERE field_name LIKE '%one' 
    OR field_name LIKE '_two' 
    OR field_name LIKE 'three[abv]' 
+0

Tôi đã hy vọng tránh được phí tổn này, nhưng nó dường như là cách duy nhất. Khi nó xảy ra, thậm chí làm nó theo cách này gây ra một chi phí lớn như tôi có một mảng của một vài trăm mục. Chỉ sử dụng IN rất nhanh. GIỐNG mất mãi mãi: / – Dave

2

bạn có thể sử dụng tham gia với tuyên bố như như dưới đây truy vấn:

SELECT * FROM table_name t 
JOIN dbo.Split('one,two,three',',') s ON t.field_name LIKE N'%'+s.item+'%' 

tôi tạo chức năng này để chia chuỗi:

CREATE FUNCTION [dbo].[Split] (@StringToSplit NVARCHAR(MAX), @SpliterChar CHAR(1)) 
RETURNS 
    @returnList TABLE ([item] [NVARCHAR] (500)) 
AS 
BEGIN 
DECLARE @nItem NVARCHAR(500); 
DECLARE @pos INT; 
WHILE CHARINDEX(@SpliterChar, @StringToSplit) > 0 
BEGIN 
    SELECT @pos = CHARINDEX(@SpliterChar, @StringToSplit); 
    SELECT @nItem = SUBSTRING(@StringToSplit, 1, @pos-1); 
    if (@nItem <> '') INSERT INTO @returnList SELECT @nItem; 
    SELECT @StringToSplit = SUBSTRING(@StringToSplit, @pos+1, LEN(@StringToSplit)[email protected]); 
END 
if (@StringToSplit<>'') INSERT INTO @returnList SELECT @StringToSplit; 
RETURN 
END 
Các vấn đề liên quan