Postgres упрощенный синтаксис для нескольких столбцов стабильной сортировки - PullRequest
0 голосов
/ 01 марта 2020

Я знаю (из этого: SQL запрос на разбиение на страницы с несколькими столбцами; понять оператор ИЛИ ), что предложение WHERE в приведенном ниже синтаксисе Postgres

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

Можете ли вы сказать мне, как я могу иметь дело с такого рода запросом в целом?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Вы можете просто отрицать значения в ваших score и id сравнениях, чтобы вы могли использовать для них < вместо >; и тогда вы можете использовать сравнение кортежей:

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

Демонстрация по SQLFiddle

0 голосов
/ 01 марта 2020

К сожалению, для сравнения кортежей требуется, чтобы все ключи были в одном направлении.

Ваш order by не соответствует where. Это должно быть:

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

Вы можете ввести новые столбцы (в основном это своего рода отрицание существующих столбцов), чтобы порядок был одинаковым для всех ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...