postgresql - 如何找出哪些单词与IN条件不匹配?

时间:2011-01-14 12:34:55

标签: sql postgresql

我有这样的查询(在 postgresql 中):

SELECT * 
  FROM tablexy 
 WHERE somevalue IN ("<string1>", "<string2>", "<...>", ... )

说,<string1>是某个值,但不是<string2>。如何获得括号中给出的不在somevalue列中的所有值?

谢谢;)

4 个答案:

答案 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是否满足您的需求?