0

用例:

  • 我有 customer_id 和 task_id。

  • 数据库将始终包含带有填充的 customer_id 和空的 task_id 的寄存器。

  • 有时会填充 task_id。(如下例所示)

示例 1 示例 1 - 数据库

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

在这里,我希望返回最后两行。

示例 2 示例 2 - 数据库

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

在这里,我希望返回唯一的空行。

问题:

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

4

1 回答 1

1

您可以使用LIMIT. 这将匹配空的 task_id 和设置的 task_id(如果存在),对它们进行排序,以便具有非空 task_id 的行在前(如果存在),然后只返回第一个。(NULLS LASTPostgre 中的默认排序行为

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)
  )
 )

这看起来不太优雅,但它应该可以工作,您至少可以将其用作起点。

于 2020-11-04T19:58:30.050 回答