SQL:尝试避免使用某些元素的名称

时间:2018-07-02 21:25:04

标签: sql character wildcard

基本上,我正在尝试查找名称中没有(GS)或(TD)的产品。我尝试实现此方法:

AND c.name NOT IN ('%(TD)%', '%(GS)%')

但这并没有过滤掉包含这些元素的名称,所以现在我要编写以下讨厌的代码:

AND c.name NOT LIKE '%(TD)%'
AND c.name NOT LIKE '%(GS)%'

我知道这是一个超出基本问题的问题,可能已经在这里某个地方被问到了,也许我在搜索时没有正确地表述它。很想找到一种更有效地编写代码的方法,这让我发疯了。

编辑:即使第二种方法是正确的,我也不明白下面的代码将如何工作:

c.name IN ('%Jordan%', '%adidas%').

按照这种逻辑,为什么我的原始方法无法正常工作?毕竟,IN运算符的全部要点是使之方便。

1 个答案:

答案 0 :(得分:0)

您上一次的编辑无效。 IN运算符确定指定的值是否与子查询或列表中的任何值匹配,并返回Boolean。这与将OR=一起使用的方式相同。也就是说,

select column from table where column in ('a', 'b')

相同
select column from table where column = 'a' or column = 'b'

LIKE允许您使用通配符和一些淡化的正则表达式,例如表达式。但是您不能混合使用这些。例如,您修改后的查询不会返回约旦或阿迪达斯的任何结果。

declare @table table (name varchar(64))
insert into @table
values
('Jordan'),
('adidas'),
('Jordans'),
('adidass')

select *
from @table
where name in ('%Jordan%','%adidas%')

这是因为此查询的计算方式为

select * from @table where name = '%Jordan%' or name = '%adidas%'

此处将通知%视为字符串文字的一部分,而不是通配符运算符。