2015-08-08 33 views
0

我知道我們可以使用LIKE進行模式匹配,但是,這裏是要做的。匹配表中的任何圖案?

我有一個表,其中有一列,「模式」,該值是這樣的:

host1% 
%host2 
.... 

我還有一個表,其中有一列,「主機」。問題是:如何檢查'Host'表中的值是否與'Pattern'中的任何模式不匹配?

如果它太複雜,那麼一個簡化的問題是:如何檢查'Host'中的值是不是StartWith'Pattern'中的任何字符串?

我們可以使用循環,但有沒有更好的方法?理想情況下,它應該爲ql服務器2008工作,但最新版本會做。

感謝

回答

2

使用where not exists接着,檢查針對包含數據的表的當前行的每個圖案的子查詢。即

where not exists 
(
    select top 1 1 
    from @patterns p 
    where d.datum like p.pattern 
) 

完整代碼工作實例:SQL Fiddle

declare @patterns table 
(
    pattern nvarchar(16) not null 
) 
declare @data table 
(
    datum nvarchar(16) not null 
) 
insert @patterns 
values ('host1%') 
,('%host2') 
insert @data 
values ('host1234') 
, ('234host1') 
, ('host2345') 
, ('345host2') 

select * 
from @data d 
where not exists 
(
    select top 1 1 
    from @patterns p 
    where d.datum like p.pattern 
) 
+0

這將有助於有別名 – Bulat

+0

@Bulat;好喊;只是懶惰;現在用別名進行修改以提高清晰度。 – JohnLBevan

1
select t1.host 
from table_1 t1 
left join table_2 t2 on t1.host like t2.pattern 
where t2.pattern is null