SQL WHERE 子句根据数据库内容获取行

SQL WHERE Clausule to get rows depending on the database content

用例:

示例 1

SELECT *
  FROM table
 WHERE customer_id = 11422412 
   AND task_id = 28870055

这里我希望 return 最后两行。

示例 2

SELECT * 
  FROM table
 WHERE customer_id = 11432515 
   AND task_id = 22256884

这里我希望return唯一的空行。

问题:

如何创建一个 SQL 查询以确保在数据库中存在 task_id 的情况下,我只 return 带有 task_id 的记录?

您可以使用 LIMIT 执行类似以下操作。这将匹配空的 task_id 和集合 task_id (如果存在),对它们进行排序,使带有 non-empty task_id 的行排在第一位(如果存在),然后return只有第一个。 (NULLS LASTdefault 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)
  )
 )

这看起来不是很优雅,但它应该可以工作,你至少可以把它作为一个起点。