PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Compare o resultado de duas funções de tabela usando uma coluna de cada


Todas as respostas a seguir pressupõem que as linhas são retornadas em correspondência ordem.

Postgres 9.3


Com o recurso peculiar de explodir linhas de funções SRF retornando o mesmo número de linhas em paralelo:
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!

Os parênteses ao redor do tipo de linha são necessários para desambiguar de uma possível referência de tabela. Detalhes no manual aqui.

Esse padrão é o produto cartesiano de linhas se o número de linhas retornadas não for o mesmo (o que o quebraria completamente para você).

Postgres 9.4

COM ORDINALIDADE para gerar números de linha em tempo real


Você pode usar COM ORDINALIDADE para gerar um número de linha em tempo real e não precisa depender do emparelhamento do resultado das funções SRF no SELECT Lista:
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;

Isso funciona para o mesmo número de linhas de cada função, bem como para números diferentes (que seriam contados como incompatibilidade).

Relacionado:

ROWS FROM para unir conjuntos linha por linha

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;

Resposta relacionada:

Além:
EXECUTAR FORMATO não é uma funcionalidade definida do plpgsql. RETORNAR CONSULTA é. format() é apenas uma função conveniente para construir uma string de consulta, pode ser usada em qualquer lugar em SQL ou plpgsql.