Sql 有没有一个场景可以让我们像其他场景一样使用NOT?
在查询Teradata时,我被发现使用了Sql 有没有一个场景可以让我们像其他场景一样使用NOT?,sql,postgresql,teradata,Sql,Postgresql,Teradata,在查询Teradata时,我被发现使用了而不是任何关键字。 通过用纯英语解析关键字,我希望查询返回与参数列表中的值不同的任何值 但是,由于语句生成的布尔逻辑(即不象X或不象Y),表中的所有值都被返回。我实际需要的关键字是不喜欢所有的(即不喜欢X,也不喜欢Y) : 我理解返回这些结果背后的基本逻辑,但我的问题是,在任何情况下,使用而不是像任何 如果没有,数据库引擎是否有充分的理由支持此关键字,因为基于关键字的纯英语解释可能存在歧义?如果您使用的是ANY而不是ALL,则不排除任何行。在这里,任何都会
而不是任何关键字。
通过用纯英语解析关键字,我希望查询返回与参数列表中的值不同的任何值
但是,由于语句生成的布尔逻辑(即不象X或不象Y
),表中的所有值都被返回。我实际需要的关键字是不喜欢所有的
(即不喜欢X,也不喜欢Y
)
:
我理解返回这些结果背后的基本逻辑,但我的问题是,在任何情况下,使用<代码>而不是像任何
如果没有,数据库引擎是否有充分的理由支持此关键字,因为基于关键字的纯英语解释可能存在歧义?如果您使用的是ANY
而不是ALL
,则不排除任何行。在这里,任何
都会像或
一样工作。因此,在任何您想在
中为使用或
的场景中,您都可以使用任何
最好不要使用
ANY
,因为我们正在生成一个等于不等于的。即它与中的相同是的,它确实有意义,只需稍加修改
以这个查询为例:
SELECT g
FROM generate_series(9995, 10005) g
WHERE g::TEXT NOT LIKE ANY(ARRAY['9996','9997'])
如果g
与它们中的任何一个都不相似,则返回TRUE。感兴趣的项目编号为9996和9997。9996与数组中第一项的不相似
比较结果为FALSE,因为9996与不相似
9996。但是我们正在寻找任何匹配,所以我们继续下一个。9996与9997不同,因此评估是真实的,并且包含9996。比较9997时相同,但第一次比较返回TRUE。因此,将选择生成_系列中的所有编号
现在稍微改变一下:
SELECT g
FROM generate_series(9995, 10005) g
WHERE NOT g::TEXT LIKE ANY(ARRAY['9996','9997'])
因为比较返回TRUE时,对ANY的计算就停止了(我试图找到此项的官方来源,但无法找到,尽管我以前读过它,而且它是有意义的),当使用LIKE
将9996与9996进行比较时,ANY
搜索会中止,因为找到了匹配项。然后这被NOT
否定,因此从结果中排除9996
9997的情况与此类似,只是第一次比较不正确,所以它会继续到下一次比较,也就是说,然后正确的被否定为错误。其余的数字不匹配,因此ANY返回FALSE,该值被反为TRUE
如果此查询是除9996和9997之外的所有生成_系列的数字,则返回结果
顺便说一句,如果数组只有一个值,那么g::TEXT NOT LIKE ANY([您的数组])
将返回预期结果。您可以在SQL中执行许多愚蠢的操作:-)确实不需要NOT LIKE ANY
,但是由于语法允许否定任何条件,因此必须支持它。顺便说一句,大多数人(包括我自己)确实在涉及而不是的布尔逻辑方面存在问题,这是一个好的观点。我自己也做过不少蠢事。我想我已经考虑过,大多数关键字都是为特定目的而设计的,而不是由布尔逻辑的组件构建的#1转换为g不喜欢9996或g不喜欢9997
,而#2转换为g不喜欢9996和g不喜欢9997
,这很有趣。我想我认为不喜欢任何
本身就是一个关键词,而不是由不
、喜欢
和任何
关键词组成。我想我理解它是如何评估上面两个例子中的不同值的。尽管如此,我仍然希望它的计算结果是不(像任何(X,Y))
,而不是不像(任何(X,Y))
。。。。虽然我还是不确定我是否正确。德诺思一针见血。。。否定条件逻辑令人困惑
SELECT g
FROM generate_series(9995, 10005) g
WHERE NOT g::TEXT LIKE ANY(ARRAY['9996','9997'])