2009-12-11 8 views
7

Tengo una función que devuelve dos parámetros como un tipo compuesto anónimo a través de output parameters.Separación del registro devuelto por la función en postgres

puedo acceder a las columnas individuales con una consulta como esta:

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

Ahora quiero combinar la salida de esta función con algunos datos:

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

Busco a una consulta que dará como resultado lo siguiente:

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

Con la confianza y relleno de columnas coincidentes ed out usando los resultados de llamar a guess_user con los nombres de esa fila.

Mi actual esfuerzo más cercana es:

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

que devuelve:

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) 

¿Hay una manera de dividir la salida guess_user en columnas separadas?

+0

En caso de que sea útil para cualquiera que desee experimentar, aquí es una función que devolverá el mismo tipo de registro como el que estoy usando: crear o reemplazar la función guess_user (firstname varchar, lastcharch varchar, OUT confidence real, OUT matchid integer) como $$ BEGIN matchid: = 1; confianza: = 0.5; REGRESO; FIN; $$ LANGUAGE plpgsql; – simoncoggins

+0

¿Sería posible implementar esto como una vista en su lugar? http://developer.postgresql.org/pgdocs/postgres/sql-createview.html –

Respuesta

1

Necesita cambiar su función to return a set - el último ejemplo es idéntico a la funcionalidad que está solicitando.

+0

'RETURNS SETOF record' para indicar que la función devuelve varias filas en lugar de solo una. No están vinculados a una tabla existente, usted podría devolver un 'TYPE' en su lugar si lo prefiere. http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions –

+0

Gracias, le di una oportunidad pero todavía no parecía poner la función en el lugar correcto para que funcione. Esta página: http://www.depesz.com/index.php/2008/11/03/waiting-for-84-pl-srf-functions-in-selects/ Parece sugerir que es una limitación de postgres, que se resuelve en 8.4 (estoy ejecutando 8.3.8). – simoncoggins

2

Basta con que sea así:

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

Tiene que usar paréntesis para acceder a los campos de tipo compuesto: seleccionar nombre, apellido, (x) .confidence, (x) .matchid De lo contrario, obtenga este error: "Falta la entrada FROM-clause para la tabla" x " " –

0

Es posible que necesite un paréntesis en la "x" en la solución de depesz, para distinguir el valor de registro compuesta de una tabla, por lo que no lo hace recibe el mensaje:

missing FROM-clause entry for table "x" 

Por lo menos lo hago en 9.0.2.

10

combinando depesz y fazal de las respuestas esto parece funcionar:

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

Para agregar un poco más de información, por http://www.postgresql.org/docs/9.3/static/rowtypes.html" Para acceder a un campo de una columna compuesta, uno escribe un punto y el nombre del campo, muy parecido a seleccionando un campo de un nombre de tabla. De hecho, es tan parecido a seleccionar de un nombre de tabla que a menudo tiene que usar paréntesis para no confundir el analizador ". –

Cuestiones relacionadas