PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Confronta il risultato di due funzioni di tabella utilizzando una colonna di ciascuna

Tutte le seguenti risposte presuppongono che le righe vengano restituite in corrispondenza ordine.

Postgres 9.3

Con la caratteristica stravagante di esplodere le righe dalle funzioni SRF che restituiscono lo stesso numero di righe in parallelo:

SELECT count(*) AS mismatches
FROM  (
   SELECT function1('tblp1','tblp2',49) AS f1
        , function2('tblp1_v2','tblp2_v2',49) AS f2
   ) sub
WHERE  (f1).dist <> (f2).dist;  -- note the parentheses!

Le parentesi attorno al tipo di riga sono necessarie per disambiguare da un possibile riferimento a una tabella. I dettagli nel manuale qui.

L'impostazione predefinita è il prodotto cartesiano delle righe se il numero di righe restituite non è lo stesso (il che lo interromperebbe completamente per te).

Postgres 9.4

WITH ORDINALITY per generare numeri di riga al volo

Puoi usare WITH ORDINALITY per generare un numero di riga al volo e non è necessario dipendere dall'associazione del risultato delle funzioni SRF nel SELECT elenco:

SELECT count(*) AS mismatches
FROM      function1('tblp1','tblp2',49)       WITH ORDINALITY AS f1(id,dist,rn)
FULL JOIN function2('tblp1_v2','tblp2_v2',49) WITH ORDINALITY AS f2(id,dist,rn) USING (rn)
WHERE  f1.dist IS DISTINCT FROM f2.dist;

Funziona per lo stesso numero di righe di ciascuna funzione e per numeri diversi (che verrebbero conteggiati come mancata corrispondenza).

Correlati:

ROWS FROM per unire gli insiemi riga per riga

SELECT count(*) AS mismatches
FROM   ROWS FROM (function1('tblp1','tblp2',49)
                , function2('tblp1_v2','tblp2_v2',49)) t(id1, dist1, id2, dist2)
WHERE  t.dist1 IS DISTINCT FROM t.dist2;

Risposta correlata:

A parte:
EXECUTE FORMAT non è una funzionalità plpgsql impostata. RETURN QUERY è. format() è solo una comoda funzione per creare una stringa di query, può essere utilizzata ovunque in SQL o plpgsql.