PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comparez le résultat de deux fonctions de table en utilisant une colonne de chacune

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.