Bij alle volgende antwoorden wordt ervan uitgegaan dat rijen worden geretourneerd in overeenkomsten bestellen.
Postgres 9.3
Met de eigenaardige eigenschap van exploderende rijen van SRF-functies die hetzelfde teruggeven aantal rijen parallel:
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!
De haakjes rond het rijtype zijn nodig om een mogelijke tabelverwijzing ondubbelzinnig te maken. Details in de handleiding hier.
Dit is standaard een Cartesiaans product van rijen als het aantal geretourneerde rijen niet hetzelfde is (wat het voor u volledig zou breken).
Postgres 9,4
WITH ORDINALITY
om direct rijnummers te genereren
U kunt WITH ORDINALITY
. gebruiken om direct een rijnummer te genereren en niet afhankelijk te zijn van het koppelen van het resultaat van SRF-functies in de SELECT
lijst:
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;
Dit werkt voor hetzelfde aantal rijen van elke functie en voor verschillende nummers (die als niet-overeenkomend worden geteld).
Gerelateerd:
ROWS FROM
om rij voor rij deel te nemen aan sets
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;
Gerelateerd antwoord:
Terzijde:EXECUTE FORMAT
is geen vaste plpgsql-functionaliteit. RETURN QUERY
is. format()
is gewoon een handige functie voor het bouwen van een queryreeks, kan overal in SQL of plpgsql worden gebruikt.