【问题标题】: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

标签: sql db2


【解决方案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
  • 是的,你是对的,我的评论不是。很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
相关资源
最近更新 更多