是否存在使用NOT LIKE ANY有意义的情况?

时间:2017-06-11 03:56:16

标签: sql postgresql teradata

查询Teradata时,我发现我使用了NOT LIKE ANY关键字 从简单的英语解析关键字,我希望查询返回任何不像参数列表中的值的值。

但是,由于语句生成的布尔逻辑(即NOT LIKE X OR NOT LIKE Y),表中的所有值都被返回。我实际需要的关键字是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%' ])
;

我理解为什么会返回这些结果背后的基本逻辑,但我的问题是,是否存在使用NOT LIKE ANY有意义的情况?

如果没有,是否有充分的理由让数据库引擎支持这个关键字,因为根据关键字的简单英语解释可能存在歧义?

2 个答案:

答案 0 :(得分:1)

是的,它确实有意义,稍作修改。

采取此查询:

SELECT g
FROM generate_series(9995, 10005) g
WHERE g::TEXT NOT LIKE ANY(ARRAY['9996','9997'])

如果gNOT LIKE 任何,则返回TRUE。感兴趣的项目是数字9996和9997. 9996与数组中第一项的NOT LIKE比较评估为FALSE,因为9996不是NOT LIKE 9996.但我们正在寻找对于任何比赛,我们继续进行下一场比赛。 9996不是9997,因此评估为TRUE且包含9996。比较9997时相同,但第一次比较返回TRUE。因此,选择generate_series中的所有数字。

现在稍微改变一下:

SELECT g
FROM generate_series(9995, 10005) g
WHERE NOT g::TEXT LIKE ANY(ARRAY['9996','9997'])

因为一旦比较返回TRUE,ANY的评估就会停止(我试图找到这个的官方来源,但无法确定我以前读过它并且有意义),当比较9996时对于使用LIKE的9996,ANY搜索会因为找到匹配而中止。然后由NOT取消,因此从结果中排除9996。

类似于9997的故事,除了第一次比较不是真的,所以它继续到下一个,即,然后TRUE被否定变为FALSE。其余的数字不匹配,因此ANY返回FALSE,否定为TRUE。

如果此查询是generate_series中除9996和9997之外的所有数字的结果。

顺便说一下,如果数组只有一个值,那么g::TEXT NOT LIKE ANY([your array])将返回预期的结果。

答案 1 :(得分:0)

如果您使用ANY代替ALL,则不排除任何行。此处ANY的行为与OR相同。因此,在OR IN使用ANY的任何情况下,您都可以使用ANY

最好不要使用IN,因为我们等于不等于。它与% python Python 2.7.9 (default, Jun 29 2016, 13:08:31) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print(2.2*55) 121.0 >>> print("%.20f" % (2.2*55)) 121.00000000000001421085 % python3 Python 3.4.2 (default, Oct 8 2014, 10:45:20) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print(2.2*55) 121.00000000000001 >>> print("%.20f" % (2.2*55)) 121.00000000000001421085 相同