sql - 查找字符串是否在数据库中
问题描述
我有一个 ID 列表
'ACE', 'ACD', 'IDs', 'IN','CD'
我也有一个类似于以下结构的表
ID value
ACE 2
CED 3
ACD 4
IN 4
IN 4
我想要一个 SQL 查询,它返回数据库中存在的 ID 列表和数据库中不存在的 ID 列表。
回报应该是:
1.ACE, ACD, IN (exist)
2.IDs,CD (not exist)
我的代码是这样的
select
ID,
value
from db
where ID is in ( 'ACE', 'ACD', 'IDs', 'IN','CD')
但是,返回是 1) 各种 ID 超级慢 2) 返回具有相同 ID 的多行。无论如何使用 postgresql 返回 1) 唯一 ID 2) 使运行更快?
解决方案
假设表或输入中没有重复项,则此查询应该这样做:
SELECT t.id IS NOT NULL AS id_exists
, array_agg(ids.id)
FROM unnest(ARRAY['ACE','ACD','IDs','IN','CD']) ids(id)
LEFT JOIN tbl t USING (id)
GROUP BY 1;
否则,请定义如何处理两边的重复项。
如果LEFT JOIN
找到匹配的行,则表达式t.id IS NOT NULL
为真。否则是假的。GROUP BY 1
由这个表达式分组(SELECT
列表中的第一个),array_agg()
为两个组中的每一个形成数组。有关的:
推荐阅读
- awk - 如果 2 列中的字符串都存在于文件 B 中,则 AWK 打印文件 A 中的行
- python - 如何使用 Python 在多个 CSV 文件中搜索字符串
- python - Python 正则表达式捕获各种 url 模式组
- nginx - 使用 NGINX 将 HTTP 重定向到 HTTPS
- amazon-ec2 - Ansible-Inventory AWS_EC2 插件如何显示主机名和私有 ip
- c# - EF Core 不会将可空字段的值设置为 NULL
- date - 如何在 Hive 中将时间戳的时间部分重置为 00:00:00?
- mongodb - 为什么 mongodb 聚合 $unwind 会更改我的 $sort 顺序?
- python - 多个单选按钮组正在链接,导致奇怪的行为
- amazon-web-services - 用于 APIGateway 部署的无服务器框架与 HTTP 端点调用?