sql - 使用 coalesce 改进 postgres 子查询

标签 sql postgresql

想象一下:两个表,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/

相关文章:

c++ - const char 到 SQLCHAR 错误

sql - Postgresql 在同一个表中选择和子选择

ruby-on-rails - ActiveRecord::Relation::ActiveRecord_Relation_Link:Class 的未定义方法 `model_name'

postgresql - 处理来自 jsonb_each 查询的记录类型

ruby-on-rails - heroku 上 "PGError: FATAL: terminating connection due to administrator command"的原因是什么?

sql - 如果找到 USER,则选择最后一行

mysql - 我在尝试添加外键时不断收到错误,我做错了什么?

mysql - MySQL 中是否有替代 CONCAT() 的方法?

php - 使用 laravel 中的 postgis 地理函数。

sql - PostgreSQL 查询到 Excel 工作表