sql - SQL WHERE 子句根据数据库内容获取行
问题描述
用例:
我有 customer_id 和 task_id。
数据库将始终包含带有填充的 customer_id 和空的 task_id 的寄存器。
有时会填充 task_id。(如下例所示)
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
是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)
)
)
这看起来不太优雅,但它应该可以工作,您至少可以将其用作起点。
推荐阅读
- javascript - 在使用箭头函数时,作为回调的函数会在不考虑事件侦听器的情况下重新加载,从而提供预期的行为。为什么会这样?
- python - cron中的python脚本
- jquery-plugins - Livewire Dom 更新中断 jquery 插件,如 Select2 .. 等
- react-native - 如何在本机反应中解决图像加载问题
- laravel - 有没有办法在 laravel、flutter 或 dart 中按计划日期或时间自动分配数据?
- swift - RxSwift modelSelected Drive model on model View & Get that model on DetailView
- c# - 为什么这个 if 语句没有初始化或更新我的变量?
- c++ - C++ lambda 复制行为
- .net - 无法从 MSI 包中读取 zip 文件
- elasticsearch - 更新 Elasticsearch 对象类型字段的限制