【问题标题】:where clause parentheses with comma separated values greater than逗号分隔值大于的 where 子句括号
【发布时间】:2019-08-23 04:49:56
【问题描述】:

这是一个非常非常菜鸟和愚蠢的问题,但我似乎无法在 Postgres 中找到以下含义:

select * 
from table 
where (last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0)

(last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0) 基本上是什么意思?它在比较什么?由于某种原因,更改第二个值似乎对结果没有影响。

【问题讨论】:

    标签: sql postgresql pagination database-cursor


    【解决方案1】:

    这是比较记录。

    如果 A 的最左边字段严格大于 B 的最左边字段,或者如果它们相等,如果 A 的第二个字段严格大于 B 的第二个字段,则记录 A 严格大于另一个 B,或者,如果这些秒字段彼此相等,如果 A 的第三个字段严格大于 B 的第三个字段,或者......它可以继续对超过 2 或 3 个字段进行比较

    因此,(last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0) 等价于:

    1. 比较第一个字段:last_updated > '2019-03-28 23:30:22.496+00:00'
    2. 如果last_updated = '2019-03-28 23:30:22.496+00:00' 然后比较第二个字段id > 0

    或者如果我把它放在一个布尔表达式中:

    `last_updated > '2019-03-28 23:30:22.496+00:00'`
    OR (
        last_updated = '2019-03-28 23:30:22.496+00:00'
        AND id > 0
    )
    

    如您所见,其他语法要短得多。


    PS:在至少版本 11 的 postgreSQL 中,您可以使用这种比较进行非常好的查找​​,例如:

    SELECT *
    FROM A
    WHERE (field1, field2, field3) IN (SELECT field1, field2, field3 FROM B)
    

    【讨论】:

      【解决方案2】:

      比较元组使用字典顺序,这意味着第二个值仅在第一个值相同的情况下使用。

      因此,如果您的行的时间戳正好是该截止值,则 id 需要大于 0。

      预感:这用于基于光标的分页,其中第二页在第一页的最后一个值之后开始(根据排序标准,这里是时间戳),id 用作决胜局(当上一页的最后一个条目和下一页的第一个条目具有相同的排序值时 --- 时间戳可能不太可能,但如果您按薪水等排序,则很有可能)。

      【讨论】:

      • 是的,你是对的,这是用于基于光标的分页。感谢您的回答。在我的情况下,由于光标猜测而选择这个作为答案。不过其他答案是正确的。
      【解决方案3】:

      括号内的值是行。来自fine manual

      4.2.13。行构造函数

      行构造函数是一个表达式,它使用其成员字段的值来构建行值(也称为复合值)。行构造函数由关键字ROW、左括号、行字段值的零个或多个表达式(用逗号分隔),最后是右括号组成。例如:

      SELECT ROW(1,2.5,'this is a test');
      

      当列表中有多个表达式时,关键字ROW 是可选的。

      然后再往下一点:

      此外,还可以比较两个行值或用 IS NULL 或 IS NOT NULL 测试一行,例如:

      SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same');
      
      SELECT ROW(table.*) IS NULL FROM table;  -- detect all-null rows
      

      所以这两行是使用<逐个元素比较的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-01
        • 2012-05-15
        相关资源
        最近更新 更多