我想设置一个sql查询,其中有一堆varchar值对应于特定数据库表的列。结果应该为我提供表格列中 not 的所有值。
这样的事情:
SELECT x.a
FROM ( SELECT ('1','2','3') AS a ) x
WHERE x not in (
SELECT knr
FROM table
)
我没有让这个工作,因为内部选择被视为单个记录我不知道如何正确设置,或者甚至可能。
任何人都可以给我一个如何存档的提示吗?
答案 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)