postgresql - как узнать, какие слова не соответствуют условию IN? - PullRequest
3 голосов
/ 14 января 2011

У меня такой запрос (в postgresql ):

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

скажем, <string1> В некотором значении, но <string2> нет. Как я могу получить все значения, указанные в скобках, которые не находятся в столбце somevalue?

спасибо;)

Ответы [ 4 ]

5 голосов
/ 14 января 2011

Это решение будет работать в более ранних версиях PostgreSQL (минимум 8.2), а также быстрее, чем ответ Пабло:

SELECT listvalue FROM (VALUES ('a'),('b'),('c')) AS list(listvalue)
LEFT JOIN tablexy ON (tablexy.somevalue=list.listvalue)
WHERE tablexy.somevalue IS NULL;

В моем тестировании это выполняется за миллисекунду для таблицы с миллионом строк, если есть индекс на somevalue, в отличие от Пабло, который занимает секунды.

В некоторых случаях это может быть быстрее:

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;

Надеюсь, это поможет!

4 голосов
/ 14 января 2011

Вам, вероятно, понадобится отдельный запрос для этого.Если у вас PostgreSQL 8.4 или новее, вы можете использовать функцию unnest:

 SELECT unnest(ARRAY['<string1>','<string2>', ...]) as element
  WHERE element not in
 SELECT somevalue FROM tablexy
0 голосов
/ 14 января 2011

Я бы использовал внешнее соединение, ПРАВИЛЬНОЕ СОЕДИНЕНИЕ в этом примере:

SELECT
    element
FROM
    tablexy 
        RIGHT JOIN (SELECT UNNEST(ARRAY['<string1>','<string2>']) AS element) AS input ON element = somevalue 
WHERE
    somevalue IS NULL;

Этот может использовать индекс "somevalue" для производительности. Проверьте EXPLAIN, чтобы увидеть план запроса и использование индекса.

0 голосов
/ 14 января 2011

SELECT * FROM tablexy ГДЕ некоторое значение NOT IN (...)

НЕ отвечает вашим потребностям?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...