您也可以使用該功能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)
只要我記得,'VALUES'子句一直在PostgreSQL中工作。我最近在8.4版本中使用它,但可能早在那之前。 – 2012-02-23 23:22:49
@Erwin:Thnx,我會糾正這一點。我認爲它也有,但是我在* Postgres Table Values Constructor *上發佈了一個快速搜索的時候沒有給我任何結果。 – 2012-02-24 06:45:54
感謝您的回答,第二個查詢完全符合我的需求。第一種更通用,因爲如果用where子句中的x.a替換x,它也適用於mysql和mssql。 – acoder 2012-02-24 12:22:58