2009-12-11 13 views
7

Ho una funzione che restituisce due parametri come tipo composito anonimo tramite output parameters.Separazione record restituito dalla funzione in postgres

posso accedere alle singole colonne con una query come questa:

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

Ora voglio combinare l'output di questa funzione con alcuni dati:

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

Sto cercando una query che emetterà quanto segue:

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

Con il riempimento delle colonne di corrispondenza e riempimento eliminato usando i risultati di chiamare guess_user con i nomi di quella riga.

Il mio attuale impegno più vicino è:

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

che restituisce:

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) 

Esiste un modo per dividere l'output guess_user in colonne separate?

+0

Nel caso in cui è utile per chi vuole sperimentare, ecco una funzione che restituisce lo stesso tipo di record, come quella che sto usando: creare o sostituire la funzione guess_user (first varchar, lastname varchar, OUT confidence reale, OUT matchid intero) come $$ BEGIN matchid: = 1; confidenza: = 0,5; RITORNO; FINE; $$ LINGUA plpgsql; – simoncoggins

+0

Sarebbe possibile implementarlo come una vista? http://developer.postgresql.org/pgdocs/postgres/sql-createview.html –

risposta

1

È necessario modificare la funzione to return a set - l'ultimo esempio è identico alla funzionalità richiesta.

+0

'RETURNS SETOF record' per indicare che la funzione restituisce più righe invece di una sola. Non sono legati a una tabella esistente, puoi invece restituire un 'TYPE' se preferisci. http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions –

+0

Grazie, ho provato, ma non riesco ancora a mettere la funzione nel posto giusto per farlo funzionare. Questa pagina: http://www.depesz.com/index.php/2008/11/03/waiting-per-84-pl-srf-functions-in-selects/ Sembra suggerire che si tratta di una limitazione di postgres, che è risolta in 8.4 (I'm in esecuzione 8.3.8). – simoncoggins

2

Basta fare in questo modo:

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

È necessario utilizzare le parentesi per accedere ai campi di tipo composito: selezionare nome, cognome, (x) .confidenza, (x) .matchid In caso contrario, ottenere questo errore: "manca la clausola FROM per la tabella" x " " –

0

potrebbe essere necessario mettere tra parentesi la "x" in soluzione di depesz, di distinguere il valore record di composito da una tabella, in modo da non visualizza il messaggio:

missing FROM-clause entry for table "x" 

Almeno faccio su 9.0.2.

10

combinando depesz e Fazal delle risposte questa sembra funzionare:

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

Per aggiungere ulteriori informazioni, per http://www.postgresql.org/docs/9.3/static/rowtypes.html" Per accedere a un campo di una colonna composita, uno scrive un punto e il nome del campo, molto simile a selezionando un campo dal nome di una tabella, infatti, è così molto simile alla selezione da un nome di tabella che è spesso necessario utilizzare le parentesi per evitare di confondere il parser. " –

Problemi correlati