基本上,我正在尝试查找名称中没有(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运算符的全部要点是使之方便。
答案 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%'
此处将通知%
视为字符串文字的一部分,而不是通配符运算符。