PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Vergleichen Sie das Ergebnis zweier Tabellenfunktionen mit jeweils einer Spalte

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.