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
: