问题描述
用例:
SELECT *
FROM table
WHERE customer_id = 11422412
AND task_id = 28870055
在这里,我希望返回最后两行。
SELECT *
FROM table
WHERE customer_id = 11432515
AND task_id = 22256884
在这里,我希望返回唯一的空行。
问题:
如何创建SQL查询以确保在数据库中存在task_id的情况下,仅返回具有task_id的记录?
解决方法
您可以使用LIMIT
执行以下操作。这将匹配空的task_id和设置的task_id(如果存在),对其进行排序,以使具有非空task_id的行排在第一位(如果存在),然后仅返回第一个。 (NULLS LAST
是default sorting behavior in Postgre)
SELECT *
FROM table
WHERE customer_id = 11432515
AND (task_id = 22256884 OR task_id IS NULL)
ORDER BY task_id
LIMIT 1
我假设您总是希望像示例中那样恰好一行。
但是还有其他方法可以执行,具体取决于您的特定情况(如果最终查询比示例复杂)。
编辑后添加了另一种方式来处理多行匹配customer_id和task_id的情况:
SELECT *
FROM table t1
WHERE customer_id = 11432515
AND (task_id = 22256884
OR (
task_id is null
AND NOT EXISTS (SELECT * FROM table t2 WHERE t2.customer_id = 11432515 AND t2.task_id = 22256884)
)
)
这看起来并不超级优雅,但它应该可以工作,您至少可以将其用作起点。