选择集合中的哪个元素不在表的列中

时间:2012-02-23 09:24:31

标签: sql postgresql

我想设置一个sql查询,其中有一堆varchar值对应于特定数据库表的列。结果应该为我提供表格列中 not 的所有值。

这样的事情:

SELECT x.a 
FROM  ( SELECT ('1','2','3') AS a ) x 
WHERE  x not in  ( 
                    SELECT knr 
                    FROM table 
                 )

我没有让这个工作,因为内部选择被视为单个记录我不知道如何正确设置,或者甚至可能。

任何人都可以给我一个如何存档的提示吗?

3 个答案:

答案 0 :(得分:2)

SELECT x.a 
FROM
    ( SELECT '1' AS a 
    UNION ALL
      SELECT '2'
    UNION ALL 
      SELECT '3'
    ) x 
WHERE a NOT IN
      ( SELECT knr FROM table1 )

Postgres已经实现了Table Values Constructor语法,因此你也可以使用它:

SELECT x.a 
FROM
    ( VALUES 
        ('1'), 
        ('2'),
        ('3')
    ) AS x(a) 
WHERE a NOT IN
      ( SELECT knr FROM table1 )

答案 1 :(得分:1)

试试这个:

select X.A
from 
    (select '1' as A union select '2' as A union select '3' as A)  x 

where A not in (select knr from table1)

答案 2 :(得分:1)

您还可以使用函数regexp_split_to_table()缩短语法:

SELECT x
FROM   regexp_split_to_table('1~2~3', '~') AS x
LEFT   JOIN tbl t ON t.knr = x
WHERE  t.knr IS NULL

使用字符串作为分隔符,保证不属于任何值。
仅当tbl.knr实际上是字符串类型(例如text)时才有效。

事实上,如果它是{strong>数字类型,而不是像integer那样:

SELECT x
FROM   regexp_split_to_table('1~2~3', '~') AS x
LEFT   JOIN tbl t ON t.knr = x::int
WHERE  t.knr IS NULL

或者,对于text

SELECT x
FROM   regexp_split_to_table('1~2~3', '~') AS x
WHERE  NOT EXISTS (SELECT * FROM tbl t WHERE t.knr = x)

integer

SELECT x
FROM   regexp_split_to_table('1~2~3', '~') AS x
WHERE  NOT EXISTS (SELECT * FROM tbl t WHERE t.knr = x::int)