Как ГДЕ работает с пустыми подзапросами в Postgres? - PullRequest
0 голосов
/ 04 июля 2018

Предположим, у меня есть таблица событий с (проиндексированными) столбцами id : uuid и created : timestamp.

Я хотел бы получить 10 самых старых событий, которые были созданы после данного события. Если данное событие не существует, то должны быть возвращены только самые старые 10.

Это моя попытка:

SELECT * 
FROM events 
WHERE created >= (
  SELECT created FROM events WHERE id = 'dab473dd-aaaa-4885-9717-e4463e2a555e' 
) 
ORDER BY created ASC
LIMIT 10

Однако, это не работает, когда данный идентификатор (в этом примере dab473dd-aaaa-4885-9717-e4463e2a555e) не существует.

Как мне поступить об этом в Postgres?

1 Ответ

0 голосов
/ 04 июля 2018

Я бы использовал COALESCE(), так как это, кажется, дает самый короткий запрос:

SELECT * 
    FROM events 
    WHERE created >= COALESCE(
      (SELECT created FROM events WHERE id = 'dab473dd-aaaa-4885-9717-e4463e2a555e'),
      '-infinity'::TIMESTAMP
    )
    ORDER BY created ASC
    LIMIT 10

Обратите внимание, что это предполагает, что created является TIMESTAMP.

Скалярные подзапросы возвращают NULL, если подзапрос возвращает пустой набор строк и, следовательно, COALESCE() переходит к стражу.

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