当用作谓词时,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】:

当您严格考虑标量相等时,是的,它是等价的。

还有其他不那么简单的案例:

当您考虑带有 INNOT 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 的语法糖?的主要内容,如果未能解决你的问题,请参考以下文章

关系数据库元组关系演算语言ALPHA

神奇的 SQL 之谓词 → 难理解的 EXISTS

对于 CONTAINS 全文谓词,SQL Server 2008 中的逻辑短路似乎失败

T-SQL:是NULL不是NULL

读SQL进阶教程笔记07_EXISTS谓词

谓词逻辑 vs 自然语言