【问题标题】:Postgres simpler syntax for multiple columns stable sorting用于多列稳定排序的 Postgres 更简单的语法
【发布时间】:2020-03-01 09:27:58
【问题描述】:

我知道(来自:SQL query for pagination with multiple columns; understand OR operator)以下 Postgres 语法中的 WHERE 子句

SELECT
    "id",
    "score"
FROM
    "players"
WHERE
    "score" > '11266' OR ( "score" = '11266' AND "id" > '4482' )
ORDER BY
    "score" ASC,
    "id" ASC
    LIMIT 3

是以下的长形式:

where (score, id) > (11266, 4482)

但是如果我有下面的查询呢?

SELECT
    "id",
    "score"
FROM
    "players"
WHERE
    (
        ( ( "created_at" ) < '2020-02-27 08:57:36.774147+00' ) -- note the "<"
        OR ( ( ( "created_at" ) = '2020-02-27 08:57:36.774147+00' ) AND ( ( "score" ) > 11266 ) ) 
        OR ( ( ( "created_at" ) = '2020-02-27 08:57:36.774147+00' ) AND ( ( "score" ) = 11266 ) AND ( ( "id" ) > 4482 ) ) 
    )
ORDER BY
    "created_at" DESC,
    "score",
    "id"
    LIMIT 3

你能告诉我一般如何处理这种查询吗?

【问题讨论】:

    标签: sql database postgresql performance sorting


    【解决方案1】:

    您可以简单地否定 scoreid 比较中的值,以便您可以使用 &lt; 代替 &gt;;然后你可以使用元组比较:

    SELECT
        "id",
        "score"
    FROM
        players
    WHERE
        ("created_at", -"score", -"id") < ('2020-02-27 08:57:36.774147+00', -11266, -4482) 
    ORDER BY
        "created_at" DESC,
        "score",
        "id"
        LIMIT 3
    

    Demo on SQLFiddle

    【讨论】:

    • 哦!这真太了不起了!!!!它将为我节省大量代码(我正在将其翻译成代码)!谢谢。
    • Postgres 太棒了!
    • @FredHors 元组(行)比较实际上是标准 SQL 语法。
    【解决方案2】:

    不幸的是,元组比较要求所有键的方向相同。

    您的order bywhere 不一致。应该是:

    ORDER BY "created_at" desc,
             "score",
             "id"
    

    您可以引入新列(基本上是对现有列的某种否定),因此所有键的顺序都是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2012-05-16
      • 2011-05-04
      • 2010-09-11
      • 1970-01-01
      • 2011-06-01
      相关资源
      最近更新 更多