其中子句用逗号分隔的值大于


这是一个

非常非常菜鸟和愚蠢的问题,但我似乎找不到 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)是什么意思?它在比较什么?由于某种原因,更改第二个值似乎对结果没有影响。

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

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

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

它是一起比较记录。

记录 A 严格大于另一个 B,如果 A 的最左边字段严格大于 B 的最左边字段,或者,如果它们相等,如果 A 的第 2 个字段严格大于 B 的第 2 个字段,或者,如果

这些秒字段彼此相等,如果 A 的第 3 个字段严格大于 B 的第 3 个字段或......它可以继续对超过 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:在postgreSQL中,至少在版本11中,您可以使用这种比较进行非常好的查找,例如:

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

括号中的值是行。从精细手册:

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

因此,使用<逐个元素比较这两行。

最新更新