Это решение будет работать в более ранних версиях 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;
Надеюсь, это поможет!