当用作谓词时,SQL 元组是不是只是扩展逻辑 AND 的语法糖?
Posted
技术标签:
【中文标题】当用作谓词时,SQL 元组是不是只是扩展逻辑 AND 的语法糖?【英文标题】:Are SQL tuples, when used as predicates, just a syntactic sugar for expanded logical AND's?当用作谓词时,SQL 元组是否只是扩展逻辑 AND 的语法糖? 【发布时间】:2021-06-05 17:12:47 【问题描述】:当用作谓词时,SQL 元组是否只是扩展逻辑 AND 的语法糖,还是还有更多?
例如。
with tmp1(c1,c2,c3) as (
select * from (
values(1,'a','apple')
,(2,'b','ball')
,(3,'c','cat')
,(4,'d','dog')
,(5,'e',null)
)
)
select * from tmp1 where (c1,c2,c3) = (1,'a','apple');
等价于
select * from tmp1 where c1 = 1 and c2 = 'a' and c3 = 'apple';
对于 IN 子句或 JOIN 也是如此
我确实检查了 NULL 意识(如果它会被翻译成 x IS NOT DISTINCT FROM y 的形式),但至少 DB2 不是
select * from tmp1 where (c1,c2,c3) = (5,'e',null); -- Empty resultset
【问题讨论】:
嗯,它对我来说不仅仅是语法糖,特别是与子选择一起使用时。它非常有用并且在使用时更短,即 WHERE (c1, c2) in (SELECT col1, col2 from xy where ...)。对于 NULL,请记住没有什么可以与 NULL 相比 - 这意味着没有任何值等于 NULL。 @MichaelTiefenbacher 啊哈!我错过了这一点。关于 NULL 意识,我在想它是否会被翻译成 x IS NOT DISTINCT FROM y 这样的形式,因此它会带来不同,但可能不是它的工作方式。 查看 db2 文档中的Basic predicate 描述,Table 3
关于row-value-expressions
。
【参考方案1】:
当您严格考虑标量相等时,是的,它是等价的。
还有其他不那么简单的案例:
当您考虑带有 IN
或 NOT IN
之类的集合运算符的谓词时,它是一个更强大的构造,如下所示:
(a, b, c) in (select x, y, z...)
(a, b, c) not in (select x, y, z...)
当谓词包含一个元组不等式。这在查询分页中特别有用。例如:
(a, b, c) >= (x, y, z)
如果没有元组,语法会更加冗长,如下所示:
a > x OR a = x AND (b > y OR b = y AND c >= z)
【讨论】:
感谢您的回答。我肯定错过了这些方面。 您的第二次重写表达式不等同于原始表达式 - 错误的大括号放置。如果您更喜欢更简单的a >= x AND b >= y AND c >= z
,它可能是(a > x OR a = x) AND (b > y OR b = y) AND c >= z
。
@MarkBarinstein 元组不等式的工作方式类似于版本号。例如,1.6.2
大于 1.5.8
,即使 2
小于 8
。
是的,你是对的,我的评论不是。很抱歉。以上是关于当用作谓词时,SQL 元组是不是只是扩展逻辑 AND 的语法糖?的主要内容,如果未能解决你的问题,请参考以下文章