是否存在使用 NOT LIKE ANY 有意义的场景?
Is there a scenario where it makes sense to use NOT LIKE ANY?
在查询 Teradata 时,我使用 NOT LIKE ANY
关键字被抓了。
通过用简单的英语解析关键字,我希望查询 return 任何与参数列表中的值不同的值。
但是,由于语句生成的布尔逻辑(即 NOT LIKE X OR NOT LIKE Y
),table 中的所有值都被 returned。我实际需要的关键字是 NOT LIKE ALL
(即 NOT LIKE X AND NOT LIKE Y
)。
CREATE TABLE t
("col" varchar(7))
;
INSERT INTO t
("col")
VALUES
('Andrew'),
('Annie'),
('Bob'),
('Bowie'),
('Charles')
;
/* Returns 'Charles' */
select col
from t
where col not like all (array[ 'An%', 'Bo%' ])
;
/* Returns all values in table */
select col
from t
where col not like any (array[ 'An%', 'Bo%' ])
;
我理解为什么要 return 编辑这些结果背后的基本逻辑,但我的问题是是否有任何场景可以使用 NOT LIKE ANY
?
如果不是,数据库引擎支持这个关键字是否有充分的理由,因为基于关键字的简单英语解释可能会产生歧义?
如果您使用 ANY
而不是 ALL
,则不会排除任何行。这里 ANY
的行为类似于 OR
。所以在任何情况下你想使用 OR
for IN
你可以使用 ANY
.
最好不要使用 ANY
,因为我们做的不是 equal.ie 它与 IN
相同
是的,它确实有道理,稍作修改。
接受这个查询:
SELECT g
FROM generate_series(9995, 10005) g
WHERE g::TEXT NOT LIKE ANY(ARRAY['9996','9997'])
如果 g
是 NOT LIKE
任何 ,则 return 为真。感兴趣的项目是数字 9996 和 9997。9996 与数组中第一项的 NOT LIKE
比较计算结果为 FALSE,因为 9996 不是 NOT LIKE
9996。但我们正在寻找任何匹配项,所以我们继续下一个。 9996 与 9997 不同,因此计算结果为 TRUE,并且包含 9996。比较 9997 时相同,除了第一个比较 returns TRUE。因此,generate_series 中的所有数字都被选中。
现在稍微改变一下:
SELECT g
FROM generate_series(9995, 10005) g
WHERE NOT g::TEXT LIKE ANY(ARRAY['9996','9997'])
因为一旦比较 return 为 TRUE,ANY 的计算就会停止(我试图为此找到一个官方来源,但找不到,但是很确定我之前读过它并且它是有道理的) ,当使用 LIKE
将 9996 与 9996 进行比较时,ANY
搜索中止,因为找到了匹配项。然后这被 NOT
取反,因此 9996 被排除在结果之外。
与 9997 类似,只是第一次比较不是 TRUE,所以它继续进行下一次比较,然后 TRUE 被取反变成 FALSE。其余数字不匹配,因此任何 return 都是 FALSE,取反为 TRUE。
如果此查询的结果是 generate_series 中除 9996 和 9997 之外的所有数字。
顺便说一句,如果数组只有一个值,那么 g::TEXT NOT LIKE ANY([your array])
会 return 预期的结果。
在查询 Teradata 时,我使用 NOT LIKE ANY
关键字被抓了。
通过用简单的英语解析关键字,我希望查询 return 任何与参数列表中的值不同的值。
但是,由于语句生成的布尔逻辑(即 NOT LIKE X OR NOT LIKE Y
),table 中的所有值都被 returned。我实际需要的关键字是 NOT LIKE ALL
(即 NOT LIKE X AND NOT LIKE Y
)。
CREATE TABLE t
("col" varchar(7))
;
INSERT INTO t
("col")
VALUES
('Andrew'),
('Annie'),
('Bob'),
('Bowie'),
('Charles')
;
/* Returns 'Charles' */
select col
from t
where col not like all (array[ 'An%', 'Bo%' ])
;
/* Returns all values in table */
select col
from t
where col not like any (array[ 'An%', 'Bo%' ])
;
我理解为什么要 return 编辑这些结果背后的基本逻辑,但我的问题是是否有任何场景可以使用 NOT LIKE ANY
?
如果不是,数据库引擎支持这个关键字是否有充分的理由,因为基于关键字的简单英语解释可能会产生歧义?
如果您使用 ANY
而不是 ALL
,则不会排除任何行。这里 ANY
的行为类似于 OR
。所以在任何情况下你想使用 OR
for IN
你可以使用 ANY
.
最好不要使用 ANY
,因为我们做的不是 equal.ie 它与 IN
是的,它确实有道理,稍作修改。
接受这个查询:
SELECT g
FROM generate_series(9995, 10005) g
WHERE g::TEXT NOT LIKE ANY(ARRAY['9996','9997'])
如果 g
是 NOT LIKE
任何 ,则 return 为真。感兴趣的项目是数字 9996 和 9997。9996 与数组中第一项的 NOT LIKE
比较计算结果为 FALSE,因为 9996 不是 NOT LIKE
9996。但我们正在寻找任何匹配项,所以我们继续下一个。 9996 与 9997 不同,因此计算结果为 TRUE,并且包含 9996。比较 9997 时相同,除了第一个比较 returns TRUE。因此,generate_series 中的所有数字都被选中。
现在稍微改变一下:
SELECT g
FROM generate_series(9995, 10005) g
WHERE NOT g::TEXT LIKE ANY(ARRAY['9996','9997'])
因为一旦比较 return 为 TRUE,ANY 的计算就会停止(我试图为此找到一个官方来源,但找不到,但是很确定我之前读过它并且它是有道理的) ,当使用 LIKE
将 9996 与 9996 进行比较时,ANY
搜索中止,因为找到了匹配项。然后这被 NOT
取反,因此 9996 被排除在结果之外。
与 9997 类似,只是第一次比较不是 TRUE,所以它继续进行下一次比较,然后 TRUE 被取反变成 FALSE。其余数字不匹配,因此任何 return 都是 FALSE,取反为 TRUE。
如果此查询的结果是 generate_series 中除 9996 和 9997 之外的所有数字。
顺便说一句,如果数组只有一个值,那么 g::TEXT NOT LIKE ANY([your array])
会 return 预期的结果。