Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Comment vérifier si deux requêtes renvoient les mêmes jeux de résultats

Question

Comment puis-je vérifier que deux requêtes renvoient le même jeu de résultats ?

Réponse

Vous pouvez procéder comme suit :

WITH
    (
        SELECT sum(cityHash64(*))
        FROM
        (
            -- your query 1 here
            -- SELECT ...
        )
    ) AS q1_resultset_hash,
    (
        SELECT sum(cityHash64(*))
        FROM
        (
            -- your query 2 here
            -- SELECT ...
        )
    ) AS q2_resultset_hash
SELECT equals(q1_resultset_hash,q2_resultset_hash) as Q1_equals_Q2

Cet exemple utilise une CTE pour calculer la somme de la valeur cityHash de chaque ligne dans ces deux requêtes, et renverra 1 si les deux jeux de résultats sont identiques.

En utilisant une séquence de nombres entiers et un formatage Pretty :

WITH
    (
        SELECT sum(cityHash64(*))
        FROM
        (
            SELECT *
            FROM numbers(10)
            ORDER BY number DESC
        )
    ) AS q1_resultset_hash,
    (
        SELECT sum(cityHash64(*))
        FROM
        (
            SELECT *
            FROM numbers(10)
            ORDER BY number ASC
        )
    ) AS q2_resultset_hash
SELECT q1_resultset_hash = q2_resultset_hash AS Q1_equals_Q2
FORMAT Pretty

renvoie :

┏━━━━━━━━━━━━━━┓
┃ Q1_equals_Q2 ┃
┡━━━━━━━━━━━━━━┩
│            1 │
└──────────────┘

Bien que cela puisse être pratique dans de nombreux cas, cette méthode ne peut pas être considérée comme une solution miracle pour valider l’égalité des jeux de résultats pour tous les types, et son utilisation comporte certaines limites ; par exemple, si une ligne contient des valeurs NULL, l’approche ci-dessus échouera.

Navigation