where子句用逗号分隔的值大于

时间:2019-04-01 23:37:25

标签: sql postgresql pagination database-cursor

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

 int average = sum / (temps.length * temps[0].length)

select * from table where (last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0) 的基本含义是什么?比较什么?出于某种原因,更改第二个值似乎对结果没有影响。

3 个答案:

答案 0 :(得分:3)

它正在比较记录。

如果A的最左边的字段严格大于B的最左边的字段,或者如果它们相等,则A的第二个字段严格大于B的第二个字段,则记录A严格大于另一个B,或者如果这些秒字段彼此相等,则如果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)

答案 1 :(得分:2)

比较元组时,按字典顺序使用,这意味着仅在第一个值绑定的情况下才使用第二个值。

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

Hunch:用于基于游标的分页,其中第二页从第一页的最后一个值(根据排序标准,此处为时间戳)开始,紧随其后,id用作平局(关于上一页的最后一个条目和下一页的第一个条目何时具有相同的排序值---时间戳可能不太可能,但如果按薪水或类似顺序订购,则很有可能。

答案 2 :(得分:1)

括起来的值是行。来自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

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