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

问题描述

用例:

  • 我有customer_id和task_id。

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

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

示例1

Example 1 - Data Base

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

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

示例2

Example 2 - database

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

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

问题:

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

解决方法

您可以使用LIMIT执行以下操作。这将匹配空的task_id和设置的task_id(如果存在),对其进行排序,以使具有非空task_id的行排在第一位(如果存在),然后仅返回第一个。 (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)
  )
 )

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