Alla följande svar förutsätter att rader returneras i matchning beställa.
Postgres 9.3
Med den udda funktionen att exploderande rader från SRF-funktioner returnerar samma antal rader parallellt:
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!
Parenteserna runt radtypen är nödvändiga för att disambiguera från en eventuell tabellreferens. Detaljer i manualen här.
Detta är standard till kartesisk produkt av rader om antalet returnerade rader inte är detsamma (vilket skulle bryta det helt för dig).
Postgres 9.4
Med ORDINALITET
för att generera radnummer i farten
Du kan använda WITH ORDINALITY
för att generera ett radnummer direkt och behöver inte vara beroende av att para ihop resultatet av SRF-funktioner i SELECT
lista:
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;
Detta fungerar för samma antal rader från varje funktion samt olika nummer (vilket skulle räknas som oöverensstämmelse).
Relaterat:
RADER FRÅN
för att sammanfoga uppsättningar rad för rad
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;
Relaterat svar:
Bortsett från:EXEKUTFORMAT
är inte en uppsättning plpgsql-funktionalitet. RETURN QUERY
är. format()
är bara en bekväm funktion för att bygga en frågesträng, kan användas var som helst i SQL eller plpgsql.