PostgreSQL: Почему подзапросы, так как выражения возвращают более одной строки, не могут функции? - PullRequest
6 голосов
/ 16 сентября 2010

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

=> select (select 1 union select 2);
ERROR:  more than one row returned by a subquery used as an expression

Но если я создаю функцию, которая делает то же самое, я получаю желаемое поведение.

=> create or replace function onetwo() returns setof integer as $$
$> select 1 union select 2 
$> $$ language 'sql' strict immutable;
CREATE FUNCTION
=> select onetwo();
 onetwo 
--------
      1
      2

Почему разница?

Ответы [ 2 ]

5 голосов
/ 16 сентября 2010

Это не сравнение яблок и яблок.

select * 
  FROM (select 1 
        union ALL 
        select 2)

... эквивалентно вашей функции.

Столбец в предложении SELECT может возвращать только одно значение для каждой записи.Что невозможно с вашим примером UNION.Поэтому я преобразовал его в производное табличное / встроенное представление, что и происходит с примером функции.

4 голосов
/ 16 сентября 2010

Хотя ответ OMG Ponies полностью верен, я бы лучше сказал так: вы путаете SELECT f() с SELECT literal.

  • SELECT f() выполняет функцию и возвращает ее результат.И функцию возврата таблицы также можно записать как SELECT * FROM f(), что еще более элегантно.Поскольку у Pg еще нет хранимых процедур - без планирования их можно выполнять с помощью функций - мы используем SELECT, поскольку Microsoft SQL использует EXECUTE

  • SELECT LITERALметод возврата литерала (то, что может поместиться в строке / столбце).

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