Перейти к основному содержимому
Перейти к основному содержимому

variant

description: 'Документация для типа данных Variant в ClickHouse' sidebar_label: 'Variant(T1, T2, ...)' sidebar_position: 40 slug: /sql-reference/data-types/variant title: 'Variant(T1, T2, ...)'

Используя CAST из обычных столбцов:

Используя функции if/multiIf, когда аргументы не имеют общего типа (настройка use_variant_as_common_type должна быть включена для этого):

Используя функции 'array/map', если элементы массива/значения карты не имеют общего типа (настройка use_variant_as_common_type должна быть включена для этого):

Чтение вложенных типов Variant как подполя

Тип Variant поддерживает чтение одного вложенного типа из столбца Variant, используя имя типа в качестве подполя. Таким образом, если у вас есть столбец variant Variant(T1, T2, T3), вы можете прочитать подполье типа T2, используя синтаксис variant.T2, это подполе будет иметь тип Nullable(T2), если T2 может быть внутри Nullable, и T2 в противном случае. Это подполе будет той же длины, что и оригинальный столбец Variant, и будет содержать значения NULL (или пустые значения, если T2 не может быть внутри Nullable) во всех строках, в которых оригинальный столбец Variant не имеет типа T2.

Подполя Variant также могут быть прочитаны с использованием функции variantElement(variant_column, type_name).

Примеры:

Чтобы узнать, какой вариант хранится в каждой строке, можно использовать функцию variantType(variant_column). Она возвращает Enum с именем типа варианта для каждой строки (или 'None', если строка равна NULL).

Пример:

Преобразование между столбцом Variant и другими столбцами

Существует 4 возможных преобразования, которые можно выполнить со столбцом типа Variant.

Преобразование столбца String в столбец Variant

Преобразование из String в Variant выполняется путем разбора значения типа Variant из строкового значения:

Преобразование обычного столбца в столбец Variant

Возможно преобразовать обычный столбец с типом T в столбец Variant, содержащий этот тип:

Примечание: преобразование из типа String всегда выполняется через разбор, если вам нужно преобразовать столбец String в String вариант типа Variant без разбора, вы можете сделать следующее:

Преобразование столбца Variant в обычный столбец

Возможно преобразовать столбец Variant в обычный столбец. В этом случае все вложенные варианты будут преобразованы в целевой тип:

Преобразование Variant в другой Variant

Возможно преобразовать столбец Variant в другой столбец Variant, но только если целевой столбец Variant содержит все вложенные типы из оригинального Variant:

Чтение типа Variant из данных

Все текстовые форматы (TSV, CSV, CustomSeparated, Values, JSONEachRow и т.д.) поддерживают чтение типа Variant. Во время разбора данных ClickHouse пытается вставить значение в наиболее подходящий тип варианта.

Пример:

Сравнение значений типа Variant

Значения типа Variant могут быть сравнены только со значениями того же типа Variant.

Результат оператора < для значений v1 с базовым типом T1 и v2 с базовым типом T2 типа Variant(..., T1, ... T2, ...) определяется следующим образом:

  • Если T1 = T2 = T, результат будет v1.T < v2.T (сравниваются базовые значения).
  • Если T1 != T2, результат будет T1 < T2 (сравниваются имена типов).

Примеры:

Если вам нужно найти строку с конкретным значением Variant, вы можете сделать одно из следующих:

  • Привести значение к соответствующему типу Variant:
  • Сравнить подполье Variant с требуемым типом:

Иногда может быть полезно сделать дополнительную проверку на тип варианта, так как подполя с комплексными типами, такими как Array/Map/Tuple, не могут быть внутри Nullable и будут иметь значения по умолчанию вместо NULL в строках с разными типами:

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

Пример:

Примечание: по умолчанию тип Variant не допускается в ключах GROUP BY/ORDER BY, если вы хотите его использовать, рассмотрите его специальное правило сравнения и включите настройки allow_suspicious_types_in_group_by/allow_suspicious_types_in_order_by.

Функции JSONExtract с Variant

Все функции JSONExtract* поддерживают тип Variant: