是否存在使用 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)。

An example using Postgresql:

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'])

如果 gNOT 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 预期的结果。