Объедините функцию postgres с запросом

В настоящее время я борюсь с выводом sql-функции, которая мне нужна в моем наборе результатов:

SELECT getAdditionalInfoAboutDate(date) from sampleCalendar

Проблема в том, что я получаю результат следующим образом:

  1. "Атрибут1, Атрибут2, Атрибут3"
  2. "Атрибут2, Атрибут3, Атрибут4"
  3. ...

Как видите, я получаю желаемый результат, но он имеет только один столбец, хотя моя функция возвращает 3 столбца.

Когда я пытаюсь создать выражение вроде:

SELECT (Select * from getAdditionalInfoAboutDate(date)) from sampleCalendar

Я получаю исключение «подзапрос должен возвращать только один столбец».

Есть ли у меня шанс как-то это решить?

Изменить: нашел ответ ЗДЕСЬ, который:

SELECT getAdditionalInfoAboutDate(date).* from sampleCalendar

person Frame91    schedule 16.11.2014    source источник
comment
Как насчет того, чтобы функция также возвращала дату, а затем выполняла select * from getAdditionalInfoAboutDate(date)?   -  person Mureinik    schedule 16.11.2014
comment
Это также приводит к тому, что подзапрос должен возвращать только один столбец.   -  person Frame91    schedule 16.11.2014
comment
Каков тип или возвращаемое значение? record ? Не могли бы вы дать больше кода о вашей функции?   -  person Houari    schedule 16.11.2014
comment
неважно, смотрите мой отредактированный вопрос - нашел ответ в другой теме!   -  person Frame91    schedule 16.11.2014


Ответы (1)


Несмотря на то, что ответ, который вы нашли, исходит от меня, может быть лучший ответ в зависимости от того, что вы функция действительно возвращает: одну или несколько строк? Предполагая one строку.

В любом случае, ваш вопрос неверный. Тип строки должен быть заключен в круглые скобки, чтобы разложить его, иначе синтаксис может быть неоднозначным. Это должно быть:

SELECT (getAdditionalInfoAboutDate(date)).* FROM sampleCalendar;

Однако здесь у Postgres есть слабое место. Функция будет оцениваться несколько раз — по одному разу для каждого столбца результата. Чтобы оптимизировать производительность, поместите вызов функции в подзапрос:

SELECT (f_row).*
FROM  (SELECT getAdditionalInfoAboutDate(date) AS f_row FROM sampleCalendar) sub;

Или используйте LEFT JOIN LATERAL на странице 9.3+.

SELECT f_row.*  -- no parentheses here, it's a table alias
FROM   sampleCalendar s
LEFT   JOIN LATERAL getAdditionalInfoAboutDate(s.date) f_row ON TRUE

Подробнее:

person Erwin Brandstetter    schedule 28.11.2014