Postgres中的空子查询在哪里工作?

时间:2018-07-04 15:51:40

标签: postgresql

假设我有一个事件表,其中有(索引)列id : uuidcreated : 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

但是,当给定的id(在此示例中为dab473dd-aaaa-4885-9717-e4463e2a555e)不存在时,它将不起作用。

我应该如何在Postgres中解决这个问题?

1 个答案:

答案 0 :(得分:3)

我会使用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

请注意,这假设createdTIMESTAMP

Scalar subqueries如果子查询返回空的行集,则返回NULL,因此COALESCE()跳到前哨。