查找提供的列表postgres中不存在的值

时间:2013-06-06 17:37:49

标签: postgresql postgresql-9.1

我正在尝试查找一个查询,告诉我不在我的数据库中的值。 例如:

      select seqID, segment from flu where seqID IN (1,2,3,4,5,6,7,8,9). 

现在如果我的数据库没有seqID的3,8,9我怎么才能找到/只显示缺少的seqID。

3 个答案:

答案 0 :(得分:6)

首先,既然您似乎是Stackoverflow的新手,那么这里有一些礼节和帖子提示:

  • 始终包含相关版本信息。在这里,你可能想要 包括PostgreSQL的版本信息
  • 简要描述您想要做什么
  • 包含任何相关的源代码(您做过的;干得好)
  • 包含任何错误
  • 解释你想要的结果(你做了什么,干得好)
  • 跟进并标记答案。对很多人来说,如果你不给 如果得到正确答案,他们将无济于事。只是一个提示。

由于你没有完成上述所有工作,我只能猜测,所以我根据你的代码做了一些假设。您似乎需要一个EXCEPT语句。以下代码是在PostgreSQL 9.1上开发的。

create temp table my_value(seq_id int);

insert into my_value(seq_id) values
(1), (2), (4), (5), (6), (7);

select unnest(array[1, 2, 3, 4, 5, 6, 7, 8, 9]) 
EXCEPT 
select distinct seq_id from my_value;

我假设您有一个硬编码的整数列表(如问题中的示例)。我刚刚创建了一个用于测试和演示目的的临时表,但我确信您可以进行必要的调整以适应您的情况。如果您没有硬编码的整数列表,那么您只需要再次选择包含它的任何来源。

希望这会有所帮助。欢迎来到Stackoverflow。

答案 1 :(得分:2)

with idlist (id) as (
   values (1),(2),(3),(4),(5),(6),(7),(8),(9)
)
select l.id as missing_seq_id
from idlist l
  left join flu f on f.seqID = l.id
where f.seqID is null;

答案 2 :(得分:0)

如果没有将所有可能的数字存储在某个表中(或者只是0-9,并且使用交叉连接以获得更高的数字),我不相信你可以做到这一点。您无法选择数据中不存在的ID或数字。如果您创建了另一个表,则查询将如下所示:

SELECT newID
FROM newTable nt
LEFT JOIN flu f ON f.seqID = nt.newID
          AND f.seqID NOT IN (SELECT * from newTable)

newID将是新制作的包含值的表的列名。 newTable是用于存储值的新表的名称。