【问题标题】:SQL: trying to avoid names with certain elementsSQL:尽量避免使用某些元素的名称
【发布时间】:2018-12-11 03:19:19
【问题描述】:

基本上,我正在尝试查找名称中没有 (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 运算符的全部目的是为了方便。

【问题讨论】:

  • 你不喜欢第二个版本,因为它有两行?这是我认为最清晰的写法。
  • 你的“讨厌的代码”是这个逻辑在 SQL 中的写法
  • 你的两行陈述对我来说也正确,但我在这个线程上看到了一些其他选项:stackoverflow.com/questions/9393439/sql-query-with-not-like-in
  • 同意:你做得对,但它冗长得令人讨厌。
  • 您使用的是什么 DBMS? ALLANY 在某些情况下可能是一个捷径。

标签: sql character wildcard


【解决方案1】:

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

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

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

【讨论】:

  • 好的,那么我原来的方法是唯一的方法吗?我不知道是否有更有效的方法来实现这一点。感谢您的帮助!
  • 正确,使用OR是怎么回事,也是唯一想实现这个逻辑的。
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 2019-01-28
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
相关资源
最近更新 更多