2012-02-23 195 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)