2009-12-11 5 views
7

У меня есть функция, которая возвращает два параметра как анонимный составной тип через output parameters.Разделительная запись, возвращаемая функцией в postgres

я могу получить доступ к отдельным столбцам с помощью запроса, как это:

# select * from guess_user('Joe','Bloggs'); 
confidence | matchid 
------------+--------- 
    0.142857 | 1121 

Теперь я хочу, чтобы объединить данные из этой функции с некоторыми данными:

# select firstname,lastname from users limit 5; 
firstname | lastname 
-----------+---------- 
Adam  | Smith 
Amy  | Peters 
Annette | Bloggs 
Annie  | Mills 
Amanda | Hibbins 

Ищу для запроса который выведет следующее:

firstname | lastname | confidence | matchid 
-----------+----------+------------+--------- 
Adam  | Smith |   | 
Amy  | Peters |   | 
Annette | Bloggs |   | 
Annie  | Mills |   | 
Amanda | Hibbins |   | 

С уверенностью и колонками соответствия с помощью результатов вызова guess_user с именами из этой строки.

Мое текущее ближайшее усилие:

# select firstname, lastname, guess_user(firstname, lastname) from users limit 5; 

Который возвращает:

firstname | lastname | guess_user 
-----------+-----------+--------------- 
Angela | Abbott | (0.285714,3) 
Amy  | Allan  | (0.285714,4) 
Annette | Allison | (0.285714,5) 
Annie  | Ashworth | (0.285714,6) 
Amanda | Baird  | (0.285714,7) 

Есть ли способ разделить выход guess_user в отдельные столбцы?

+0

В случае, если это полезно для тех, кто хочет экспериментировать, вот функция, которая будет возвращать один и тот же тип записи, как один я использую: создайте или замените функцию guess_user (firstname varchar, lastname varchar, OUT trust real, OUT matchid integer) как $$ BEGIN matchid: = 1; доверие: = 0,5; ВЕРНУТЬ; КОНЕЦ; $$ LANGUAGE plpgsql; – simoncoggins

+0

Можно ли реализовать это как представление? http://developer.postgresql.org/pgdocs/postgres/sql-createview.html –

ответ

1

Вам необходимо изменить функцию to return a set - последний пример идентичен запрошенной функциональности.

+0

'RETURNS SETOF record', чтобы указать, что функция возвращает несколько строк вместо одного. Они не привязаны к существующей таблице, вы можете вернуть «ТИП», если хотите. http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions –

+0

Спасибо, я дал это, но я все еще не мог поместить функцию в нужное место, чтобы заставить ее работать. Эта страница: http://www.depesz.com/index.php/2008/11/03/waiting-for-84-pl-srf-functions-in-selects/ Кажется, это ограничение постов, которое разрешено на 8.4 (я выполняю 8.3.8). – simoncoggins

2

Просто сделать это следующим образом:

select firstname, lastname, x.confidence, x.matchid 
from 
(
select firstname, lastname, guess_user(firstname, lastname) as x 
from users 
limit 5 
) q; 
+0

Вы должны использовать круглые скобки для доступа к типам составного типа: выберите firstname, lastname, (x) .confidence, (x) .matchid В противном случае получите эту ошибку: «Отсутствует запись FROM-clause для таблицы« x », « –

0

Вам может понадобиться скобки на «х» в растворе depesz, в отличить составное значение записи из таблицы, так что вы не получите сообщение:

missing FROM-clause entry for table "x" 

По крайней мере, я делаю на 9.0.2.

10

объединения depesz и Фазали ответов это похоже на работу:

select firstname, lastname, (guess_user(firstname, lastname)).* 
from users 
limit 5 
+0

Чтобы добавить немного больше информации, на http://www.postgresql.org/docs/9.3/static/rowtypes.html« Чтобы получить доступ к полю составного столбца, вы пишете точку и имя поля, выбирая поле из имени таблицы. Фактически, это очень похоже на выбор из имени таблицы, в котором вам часто приходится использовать круглые скобки, чтобы не путать парсер ». –

Смежные вопросы