假设我有一个事件表,其中有(索引)列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
但是,当给定的id(在此示例中为dab473dd-aaaa-4885-9717-e4463e2a555e
)不存在时,它将不起作用。
我应该如何在Postgres中解决这个问题?
答案 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
请注意,这假设created
是TIMESTAMP
。
Scalar subqueries如果子查询返回空的行集,则返回NULL
,因此COALESCE()
跳到前哨。