2012-03-20 122 views
1

我想執行與IN運營商如LIKE風格比較比較:LIKE與運營商

select * 
from tbl1 
where tbl1.value_to_check in (select allowed_str from allowedvalues) 

凡允許值可能包括以下allowed_str

ab% (allow any string starting ab) 
%ab (allow any string ending ab) 

上面的查詢顯然不不是以這種方式工作但是有沒有一種方法可以實現這一點使用SQL Server 2008?

回答

4

不,IN不支持這個。嘗試:

SELECT t1.* 
FROM dbo.tbl1 AS t1 
INNER JOIN dbo.allowedvalues AS a 
ON t1.value_to_check LIKE '%' + a.allowed_str + '%'; 

由於達明所指出的,如果你存儲ab%%ab分開,而不是僅僅ab自身,那麼你只需要:

SELECT t1.* 
FROM dbo.tbl1 AS t1 
INNER JOIN dbo.allowedvalues AS a 
ON t1.value_to_check LIKE a.allowed_str; 
+0

如果您已經移動到連接樣式,和'allowed_str'確實含有AB''%,然後沒有必要添加額外的'%',是嗎? – 2012-03-20 15:17:37

+0

@Damien_The_Unbeliever如果't1.value_to_check'包含'absence'和'flab'並且兩者都預期匹配,我不認爲你可以忽略'%'。我想你可以使用'OR'並分別檢查每個案例,以便索引可能有助於部分查詢,但我不確定整體情況會更好。 – 2012-03-20 15:20:39

+0

我的意思是OP似乎表明這個列已經包含了一個「like」式的表達式 – 2012-03-20 15:22:38

0

我相信存在子句匹配更好與原始查詢。

select * 
from tbl1 
where exists (select 1 
       from allowedvalues 
       where tbl1.value_to_check like '%' + a.allowed_str + '%';) 

注:這都將導致表掃描上TBL1(和可能會很慢)