选择计数(不同)col不喜欢('%d1,%d2,...')

时间:2015-12-10 07:12:36

标签: sql sql-server tsql

select 
    count(distinct [PROV_CT]) 
from 
    [HRecent] 
where 
    [PROV_CT] not like  ('%P125, %P961, %P160, %P960, %P220, %P004') 

我可以写这样的查询吗?实际上它显示的输出与查询输出不同。

select  
    count(distinct [PROV_CT])
from
    [HRecent]
where 
    [PROV_CT] not like '%P125' and
    [PROV_CT] not like '%P220' and
    [PROV_CT] not like '%P960' and
    [PROV_CT] not like '%P004' and
    [PROV_CT] not like '%P961' and
    [PROV_CT] not like '%P160' 

有人可以帮帮我吗?我想写一个优化的查询。

1 个答案:

答案 0 :(得分:0)

您不能使用单个字符串文字来编写查询,如:

[PROV_CT] not like  ('%P125, %P961, %P160, %P960, %P220, %P004') 

此谓词不会查找单独的值,例如'%P125''%P961'等。

如果你有一个非常大的列表,要对其执行NOT LIKE操作,那么这样做可能更简单:

select  
    count(distinct [PROV_CT])
from
    [HRecent]
cross apply (
  select count(*)
  from (values ('%P125'), ('%P961'), 
               ('%P160'), ('%P960'), 
               ('%P220'), ('%P004') ) AS t(v)
  where [PROV_CT] LIKE t.v) AS x(cnt)
where x.cnt = 0

使用VALUES表值构造函数,您可以创建一个内联表,其中包含要与[PROV_CTRCT]列进行比较的所有值。然后使用 LIKE操作查询此表,以查找是否匹配。

Demo here