【发布时间】: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。