提取集合/列表中不在数据库中的值

时间:2014-03-08 17:50:04

标签: sql database postgresql

我很清楚这有点尴尬,但我正在寻找一种方法来了解一组中不在我的数据库表中的值,换句话说,我需要这样的东西:给定一个表“table”和列“column”,假设“column”具有{“a”,“b”}的域(这些是“column”的所有行对属性“column”采用的值)如果我们把它交给一套(怎么做?)(假设这个集合是{“a”,“b”,“c”,“d”}),那么返回将是一个带有一列的表“table” “列”和行上的两个结果“c”和“d”。

这可以通过sql请求完成吗? 我想这可以用Oracle的Dual表来实现,但是因为我正在研究Postgres,所以我需要一些奇特的技巧。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用generate_series()函数生成一种“虚拟表”。

SELECT s.a as "column"
FROM generate_series(ascii('a'), ascii('d')) AS s("column")
LEFT OUTER JOIN mytable t
  ON chr(s."column") = t."column"
WHERE t."column" IS NULL;

该查询未经过测试,但它应该让您入门。


重新评论:

如果你有一个任意的值列表,而不是一系列连续值,你可以把它变成一个公用表表达式(这个解决方案已经被另一个用户发布了,但他们随后删除了他们的回答)。

WITH s AS (
  SELECT 'a' AS "column" UNION ALL
  SELECT 'b' UNION ALL
  SELECT 'c' UNION ALL
  SELECT 'd' 
)
SELECT s.a as "column"
FROM s
LEFT OUTER JOIN mytable t
  ON s."column" = t."column"
WHERE t."column" IS NULL;

是的,你必须编写应用程序代码来格式化输入值列表中的查询。