November 1, 2010

Как получить пустое множество в IN

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

Допустим надо проверить, что поле входит в какое-то множество. Очевидно, что надо использовать конструкцию типа

field IN (1, 2, 3, ...)

Но что если это множество пустое. Как его указать?

field IN (???)

Действительно, просто пустые скобки указать нельзя, получим ошибку.

postgres@localhost:5432 test=#
SELECT 1 IN ();
ERROR: syntax error at or near ")"
LINE 1: SELECT 1 IN ();
^


Просто NULL тоже нельзя.

postgres@localhost:5432 test=#
SELECT 1 IN NULL;
ERROR: syntax error at or near "NULL"
LINE 1: SELECT 1 IN NULL;
^


NULL в скобках опять нельзя, т.к. в результате всегда будет NULL.

postgres@localhost:5432 test=#
SELECT 1 IN (NULL);
?column?
----------

(1 row)


Как тогда быть? Ответ получается из вопроса - просто получить пустое множество.

postgres@localhost:5432 test=#
SELECT 1 IN (SELECT 1 WHERE FALSE);
?column?
----------
f
(1 row)

postgres@localhost:5432 test=#
SELECT 1 NOT IN (SELECT 1 WHERE FALSE);
?column?
----------
t
(1 row)

1 comment:

Anonymous said...

in - это: =any

поэйтому просто select 1 =any ( array[]::integer[] )

Post a Comment