Toutes les réponses suivantes supposent que les lignes sont renvoyées dans correspondance commande.
Postgres 9.3
Avec la fonctionnalité originale d'explosion des lignes des fonctions SRF renvoyant le même nombre de lignes en parallèle :
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!
Les parenthèses autour du type de ligne sont nécessaires pour lever l'ambiguïté d'une éventuelle référence de table. Détails dans le manuel ici.
La valeur par défaut est le produit cartésien des lignes si le nombre de lignes renvoyées n'est pas le même (ce qui le cassera complètement pour vous).
Postgres 9.4
WITH ORDINALITY
pour générer des numéros de ligne à la volée
Vous pouvez utiliser WITH ORDINALITY
pour générer un numéro de ligne à la volée et n'ont pas besoin de dépendre de l'appariement du résultat des fonctions SRF dans le SELECT
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;
Cela fonctionne pour le même nombre de lignes de chaque fonction ainsi que pour des nombres différents (ce qui serait compté comme une non-concordance).
Connexe :
ROWS FROM
pour joindre des ensembles ligne par ligne
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;
Réponse connexe :
A part :EXECUTE FORMAT
n'est pas une fonctionnalité plpgsql définie. RETURN QUERY
est. format()
est juste une fonction pratique pour créer une chaîne de requête, peut être utilisée n'importe où dans SQL ou plpgsql.