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

SQL:试图避免使用某些元素的名称,sql,character,wildcard,Sql,Character,Wildcard,基本上,我试图找到那些名字中没有(GS)或(TD)的产品。我试着实现这一点: AND c.name NOT IN ('%(TD)%', '%(GS)%') 但这并没有过滤掉包含这些元素的名称,所以现在我只能写下面这些讨厌的代码: AND c.name NOT LIKE '%(TD)%' AND c.name NOT LIKE '%(GS)%' 我知道这是一个超越基本的问题,它可能在这里的某个地方被问过,也许我在搜索时没有正确地表达它。我很想找到一种更有效的方法来写这篇文章,这让我发疯 编辑:

基本上,我试图找到那些名字中没有(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操作符的全部目的就是让这一切变得更方便。

您上次的编辑不起作用。中的
运算符确定指定值是否与子查询或列表中的任何值匹配,返回
布尔值。这与使用
=
的方法相同。就是

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

select column from table where column = 'a' or column = 'b'
LIKE
允许使用通配符和一些简化的正则表达式。但你不能把这些混在一起。例如,您编辑的查询不会返回Jordan或Adidas的任何结果

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%'

注意,
%
在这里被视为字符串文本的一部分,而不是通配符

你不喜欢第二个版本,因为它有两行?我认为这是写这篇文章的最清晰的方式。你的“讨厌的代码”就是这个逻辑在SQL中的编写方式。你的两行语句在我看来也是正确的,但我在这个线程上看到了一些其他选项:Agreedo:你做得对,但它太冗长了。你在使用什么DBMS
ALL
ANY
在某些情况下可能是一种快捷方式。好吧,那么我原来的方法是实现这一点的唯一方法吗?我不知道是否有更有效的方法来实现这一点。谢谢你的帮助!正确,使用
是实现此逻辑的唯一方法。