SQL WHERE 子句根据数据库内容获取行
SQL WHERE Clausule to get rows depending on the database content
用例:
我有 customer_id 和 task_id。
数据库将始终包含填充 customer_id 和空 task_id 的寄存器。
有时会填满task_id。 (如下例)
示例 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 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)
)
)
这看起来不是很优雅,但它应该可以工作,你至少可以把它作为一个起点。
用例:
我有 customer_id 和 task_id。
数据库将始终包含填充 customer_id 和空 task_id 的寄存器。
有时会填满task_id。 (如下例)
示例 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 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)
)
)
这看起来不是很优雅,但它应该可以工作,你至少可以把它作为一个起点。