您也可以使用该功能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