查询Teradata时,我发现我使用了NOT LIKE ANY
关键字
从简单的英语解析关键字,我希望查询返回任何不像参数列表中的值的值。
但是,由于语句生成的布尔逻辑(即NOT LIKE X OR NOT LIKE Y
),表中的所有值都被返回。我实际需要的关键字是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%' ])
;
我理解为什么会返回这些结果背后的基本逻辑,但我的问题是,是否存在使用NOT LIKE ANY
有意义的情况?
如果没有,是否有充分的理由让数据库引擎支持这个关键字,因为根据关键字的简单英语解释可能存在歧义?
答案 0 :(得分:1)
是的,它确实有意义,稍作修改。
采取此查询:
SELECT g
FROM generate_series(9995, 10005) g
WHERE g::TEXT NOT LIKE ANY(ARRAY['9996','9997'])
如果g
为NOT 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
相同