想象一下:两个表,cases 和 case_messages。一个案例可以有任意数量的消息,也可以没有。这些消息之一可能是案例的最终答案。我现在想返回一个带有 bool 列的案例列表,告诉我是否有最终答案。如果一个案例根本没有消息,查询应该返回“false”。仅当 case_messages 中至少有一条相关消息(其中 isfinalanswer = true)时,查询才应返回 true。我设法通过 coalesce 和子查询来实现它,但感觉 super 难看:
SELECT cases.id, cases.title,
COALESCE((SELECT isfinalanswer FROM case_messages WHERE caseid = cases.id ORDER BY isfinalanswer DESC LIMIT 1), false) AS hasfinalanswer,
FROM cases;
我该如何改进?
最佳答案
我建议使用 exists
:
SELECT c.id, c.title,
(exists (SELECT 1 FROM case_messages cm WHERE cm.caseid = c.id and isfinalanswer = true)
) as hasfinalanswer
FROM cases c;
不知道大家会不会觉得这样不那么丑。
我应该补充一点,为了性能(问题中未提及),您需要在 case_messages(caseid, isfinalanswer)
上建立索引。有了这样的索引,这可能是性能最高的解决方案。
关于sql - 使用 coalesce 改进 postgres 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26098865/