Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Как проверить, возвращают ли два запроса одинаковые наборы результатов

Вопрос

Как убедиться, что два запроса возвращают одинаковые наборы результатов?

Ответ

Можно использовать следующий подход:

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

В этом примере используется CTE для вычисления суммы значений cityHash для каждой строки в этих двух запросах; если два набора результатов идентичны, будет возвращено 1.

Используем последовательность целых чисел и наглядное форматирование:

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

вернёт:

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

Хотя во многих случаях это может быть удобно, такой подход нельзя считать универсальным способом проверки равенства наборов результатов для всех типов, и при его использовании есть ряд оговорок. Например, если хотя бы одна строка содержит значения NULL, описанный выше подход не сработает.

Navigation