首页 > 解决方案 > 查找字符串是否在数据库中

问题描述

我有一个 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) 使运行更快?

标签: sqlpostgresql

解决方案


假设表或输入中没有重复项,则此查询应该这样做:

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()为两个组中的每一个形成数组。有关的:


推荐阅读