Утилиты

Утилиты — это функции для работы с данными различных типов, которые сложно отнести к конкретной категории. Их описания собраны в этом разделе.

hash()

Описание

Возвращает хеш данных из argument в виде числа.

Использование

hash(argument)

Посмотреть пример
SELECT
    hash('Tengri') AS hash;
+----------------------+
|         hash         |
+----------------------+
| 15418814193266442000 |
+----------------------+

unnest()

Описание

Разворачивает списки или структуры из argument в множество отдельных значений.

Использование

unnest(argument) [, recursive := true] [, max_depth := <num>]

Применение функции к списку дает одну строку на каждый элемент списка. Обычные скалярные выражения в том же выражении SELECT повторяются для каждой выводимой строки.

Когда несколько списков разворачиваются в одном выражении SELECT, они разворачиваются каждый в отдельный столбец. Если один список длиннее другого, более короткий список заполняется значениями NULL.

Функция изменяет кардинальность данных.

Параметры

  • recursive := true
    Включает рекурсивный режим. Если этот режим включен (значение true), то функция полностью разворачивает списки, а затем полностью разворачивает вложенные структуры. Это может быть полезно для полного "уплощения" столбцов, которые содержат списки внутри списков или структуры внутри списков. Обратите внимание, что списки внутри структур не разворачиваются.

    Подробнее о параметре на примерах

    Покажем работу этого параметра на двух примерах с одними и теми же данными с включенным параметром и без него:

    SELECT
        unnest([[1, 2, 3], [4, 5]], recursive := true) AS result;
    +--------+
    | result |
    +--------+
    | 1      |
    +--------+
    | 2      |
    +--------+
    | 3      |
    +--------+
    | 4      |
    +--------+
    | 5      |
    +--------+
    SELECT
        unnest([[1, 2, 3], [4, 5]]) AS result;
    +---------+
    |  result |
    +---------+
    | {1,2,3} |
    +---------+
    | {4,5}   |
    +---------+

  • max_depth := <num>
    Параметр max_depth позволяет ограничить максимальную глубину рекурсивного развертывания. Рекурсивный режим автоматически включен, если указана максимальная глубина.

    Подробнее о параметре на примерах

    Покажем работу этого параметра на трех примерах с одними и теми же данными: с глубиной развертывания по умолчанию (1), с глубиной развертывания 2 и с глубиной развертывания 3:

    SELECT
        unnest([[['T', 'e'], ['n', 'g']], [['r', 'i'], []], [['!', '!', '!']]])
    AS result;
    +-------------------------+
    |          result         |
    +-------------------------+
    | {['T', 'e'],['n', 'g']} |
    +-------------------------+
    | {['r', 'i'],[]}         |
    +-------------------------+
    | {['!', '!', '!']}       |
    +-------------------------+
    SELECT
        unnest([[['T', 'e'], ['n', 'g']], [['r', 'i'], []], [['!', '!', '!']]],
        max_depth := 2)
    AS result;
    +---------+
    |  result |
    +---------+
    | {T,e}   |
    +---------+
    | {n,g}   |
    +---------+
    | {r,i}   |
    +---------+
    | {}      |
    +---------+
    | {!,!,!} |
    +---------+
    SELECT
        unnest([[['T', 'e'], ['n', 'g']], [['r', 'i'], []], [['!', '!', '!']]],
        max_depth := 3)
    AS result;
    +--------+
    | result |
    +--------+
    | T      |
    +--------+
    | e      |
    +--------+
    | n      |
    +--------+
    | g      |
    +--------+
    | r      |
    +--------+
    | i      |
    +--------+
    | !      |
    +--------+
    | !      |
    +--------+
    | !      |
    +--------+
Посмотреть еще примеры
SELECT
    unnest([1,2,3])       AS numbers,
    unnest(['a','b','c']) AS letters;
+---------+---------+
| numbers | letters |
+---------+---------+
| 1       | a       |
+---------+---------+
| 2       | b       |
+---------+---------+
| 3       | c       |
+---------+---------+
SELECT
    unnest([1,2,3])   AS numbers,
    unnest(['a','b']) AS letters;
+---------+---------+
| numbers | letters |
+---------+---------+
| 1       | a       |
+---------+---------+
| 2       | b       |
+---------+---------+
| 3       | null    |
+---------+---------+
SELECT
    unnest([{'column_a': 1, 'column_b': 84},
            {'column_a': 100, 'column_b': NULL, 'column_c':22}],
            recursive := true);
+----------+----------+----------+
| column_a | column_b | column_c |
+----------+----------+----------+
| 1        | 84       | null     |
+----------+----------+----------+
| 100      | null     | 22       |
+----------+----------+----------+
SELECT
    unnest([{'column_a': 1, 'column_b': 84},
            {'column_a': 100, 'column_b': NULL, 'column_c':22}])
AS result;
+-----------------------------------------------------+
|                        result                       |
+-----------------------------------------------------+
| {"column_a": 1, "column_b": 84, "column_c": null}   |
+-----------------------------------------------------+
| {"column_a": 100, "column_b": null, "column_c": 22} |
+-----------------------------------------------------+