我有这样的查询(在 postgresql 中):
SELECT *
FROM tablexy
WHERE somevalue IN ("<string1>", "<string2>", "<...>", ... )
说,<string1>
是某个值,但不是<string2>
。如何获得括号中给出的不在somevalue列中的所有值?
谢谢;)
答案 0 :(得分:5)
此解决方案适用于早期的PostgreSQL版本(至少8.2),也比Pablo的答案更快:
SELECT listvalue FROM (VALUES ('a'),('b'),('c')) AS list(listvalue)
LEFT JOIN tablexy ON (tablexy.somevalue=list.listvalue)
WHERE tablexy.somevalue IS NULL;
在我的测试中,如果somevalue
上有一个索引,那么在一个包含一百万行的表上以毫秒为单位执行,与Pablo不同,这需要几秒钟。
在某些情况下,这可能会更快:
SELECT listvalue FROM (VALUES ('a'),('b'),('c')) AS list(listvalue)
WHERE NOT EXISTS (SELECT 1 FROM tablexy where somevalue=listvalue);
这是一个缓慢而明显的方法:
SELECT listvalue FROM (VALUES ('a'),('b'),('c')) AS list(listvalue)
EXCEPT
SELECT somevalue FROM tablexy;
希望这有帮助!
答案 1 :(得分:4)
您可能需要单独的查询。如果你有PostgreSQL 8.4或更高版本,你可以使用unnest
函数:
SELECT unnest(ARRAY['<string1>','<string2>', ...]) as element
WHERE element not in
SELECT somevalue FROM tablexy
答案 2 :(得分:0)
我会在这个例子中使用外连接,右连接:
SELECT
element
FROM
tablexy
RIGHT JOIN (SELECT UNNEST(ARRAY['<string1>','<string2>']) AS element) AS input ON element = somevalue
WHERE
somevalue IS NULL;
这个可以使用“somevalue”的索引来提高性能。检查EXPLAIN以查看查询计划和索引的使用情况。
答案 3 :(得分:-1)
SELECT * FROM tablexy WHERE somevalue NOT IN(...)
NOT是否满足您的需求?