2012-02-23 196 views
0

我想建立一个SQL查询,我有一堆varchar值对应于特定数据库表的一列。结果应该给我在表列中的所有值而不是选择什么元素的集合是不是在表列

事情是这样的:

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

我没有得到这个工作,因为内选择作为一个记录处理,我不知道如何设置它吧,或者,如果这是连可能。

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

回答

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) 
+0

只要我记得,'VALUES'子句一直在PostgreSQL中工作。我最近在8.4版本中使用它,但可能早在那之前。 – 2012-02-23 23:22:49

+0

@Erwin:Thnx,我会纠正这一点。我认为它也有,但是我在* Postgres Table Values Constructor *上发布了一个快速搜索的时候没有给我任何结果。 – 2012-02-24 06:45:54

+0

感谢您的回答,第二个查询完全符合我的需求。第一种更通用,因为如果用where子句中的x.a替换x,它也适用于mysql和mssql。 – acoder 2012-02-24 12:22:58

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) 
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

如果是,事实上,一个数字型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)