Bei allen folgenden Antworten wird davon ausgegangen, dass Zeilen beim Matching zurückgegeben werden bestellen.
Postgres 9.3
Mit der skurrilen Funktion, Zeilen von SRF-Funktionen aufzulösen, die dasselbe zurückgeben Anzahl paralleler Zeilen:
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!
Die Klammern um den Zeilentyp sind notwendig, um eine mögliche Tabellenreferenz zu unterscheiden. Details im Handbuch hier.
Dies ist standardmäßig das kartesische Produkt von Zeilen, wenn die Anzahl der zurückgegebenen Zeilen nicht dieselbe ist (was es für Sie vollständig kaputt machen würde).
Postgres 9.4
WITH ORDINALITY
um Zeilennummern on the fly zu generieren
Sie können WITH ORDINALITY
verwenden um eine Zeilennummer im Handumdrehen zu generieren und müssen sich nicht auf das Paaren des Ergebnisses von SRF-Funktionen in SELECT
verlassen Liste:
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;
Dies funktioniert für die gleiche Anzahl von Zeilen aus jeder Funktion sowie für unterschiedliche Zahlen (die als Nichtübereinstimmung gewertet würden).
Verwandte:
ROWS FROM
Sätze zeilenweise zu verbinden
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;
Zugehörige Antwort:
Nebenbei:EXECUTE FORMAT
ist keine festgelegte plpgsql-Funktionalität. RETURN QUERY
ist. format()
ist nur eine bequeme Funktion zum Erstellen einer Abfragezeichenfolge, kann überall in SQL oder plpgsql verwendet werden.