Функция cast
Область применения: Databricks SQL Databricks Runtime
Приводит значение expr
к типу данных type
. Этот оператор является синонимом оператора :: (знак двоеточия)
Синтаксис
cast(sourceExpr AS targetType)
Аргументы
sourceExpr
: любое выражение, допускающее приведение.targetType
— тип данных результата.
Возвраты
Результат имеет тип targetType
.
Допустимы следующие сочетания приведения типов данных:
Источник (запись) Цель (столбец) | VOID | numeric | STRING | DATE | TIMESTAMP | TIMESTAMP_NTZ | Интервал года в месяц | интервал дня | BOOLEAN | BINARY | ARRAY | MAP | STRUCT | ВАРИАНТ | ОБЪЕКТ |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
VOID | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | N |
numeric | N | Y | Y | N | Y | N | Y | Y | Y | N | N | N | N | Y | N |
STRING | N | Y | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | Y | N |
DATE | N | N | Y | Y | Y | Y | N | N | N | N | N | N | N | Y | N |
TIMESTAMP | N | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | Y | N |
TIMESTAMP_NTZ | N | N | Y | Y | Y | Y | N | N | N | N | N | N | N | Y | N |
Интервал года в месяц | N | Y | Y | N | N | N | Y | N | N | N | N | N | N | N | N |
интервал дня | N | Y | Y | N | N | N | N | Y | N | N | N | N | N | N | N |
BOOLEAN | N | Y | Y | N | Y | N | N | N | Y | N | N | N | N | Y | N |
BINARY | N | Y | Y | N | N | N | N | N | N | Y | N | N | N | Y | N |
ARRAY | N | N | Y | N | N | N | N | N | N | N | Y | N | N | Y | N |
MAP | N | N | Y | N | N | N | N | N | N | N | N | Y | N | N | N |
STRUCT | N | N | Y | N | N | N | N | N | N | N | N | N | Y | N | N |
ВАРИАНТ | N | Y | Y | Y | Y | Y | N | N | Y | Y | Y | Y | Y | Y | N |
ОБЪЕКТ | N | N | N | N | N | N | N | N | N | N | N | Y | Y | N | N |
Правила и ограничения с учетом targetType
Предупреждение
В Databricks Runtime, если параметр spark.sql.ansi.enabledfalse
, переполнение не приведет к ошибке, но вместо этого будет "упаковывать" результат.
Значение sourceExpr
с недопустимым форматом или недопустимыми символами targetType
приведет к NULL
.
numeric
Если targetType
является числом, а sourceExpr
имеет тип:
-
Результатом является
NULL
указанный числовой тип. -
Если
targetType
это целочисленное число, результатsourceExpr
усечен до целого числа.В противном случае результат округляется
sourceExpr
до размера доступной шкалыtargetType
.Если значение выходит за диапазон
targetType
, возникает ошибка переполнения.Используйте try_cast, чтобы преобразовать ошибки переполнения в
NULL
. -
sourceExpr
считывается как литеральное значениеtargetType
.Если
sourceExpr
не соответствует формату для литеральных значений, выдается ошибка.Если значение не входит в диапазон
targetType
, возникает ошибка переполнения.Используйте try_cast, чтобы преобразовать ошибки переполнения и недопустимого формата в
NULL
. -
Результатом будет число секунд между
1970-01-01 00:00:00 UTC
иsourceExpr
.Если
targetType
является целочисленным, результат усекается до целого числа.В противном случае результат округляется, чтобы соответствовать доступной шкале
targetType
.Если результат не входит в диапазон
targetType
, возникает ошибка переполнения.Используйте try_cast, чтобы преобразовать ошибки переполнения в
NULL
. -
Область применения: Databricks SQL Databricks Runtime 11.3 LTS и выше
Целевой тип должен быть точным числовым значением.
Учитывая
INTERVAL upper_unit TO lower_unit
, результат измеряется в общем числеlower_unit
. Еслиlower_unit
равноSECOND
, дробные секунды хранятся справа от десятичной запятой. Для всех остальных интервалов результатом всегда является целое число. -
Если
sourceExpr
равно:true
— результатом будет 1.false
— результатом будет 0.NULL
— результатом будетNULL
.
-
Правила типа фактического
VARIANT
значения типа применяются.
Примеры
> SELECT cast(NULL AS INT);
NULL
> SELECT cast(5.6 AS INT);
5
> SELECT cast(5.6 AS DECIMAL(2, 0));
6
> SELECT cast(-5.6 AS INT);
-5
> SELECT cast(-5.6 AS DECIMAL(2, 0));
-6
> SELECT cast(128 AS TINYINT);
Overflow
> SELECT cast(128 AS DECIMAL(2, 0));
Overflow
> SELECT cast('123' AS INT);
123
> SELECT cast('123.0' AS INT);
Invalid format
> SELECT cast(TIMESTAMP'1970-01-01 00:00:01' AS LONG);
1
> SELECT cast(TIMESTAMP'1970-01-01 00:00:00.000001' AS DOUBLE);
1.0E-6
> SELECT cast(TIMESTAMP'2022-02-01 00:00:00' AS SMALLINT);
error: overflow
> SELECT cast(true AS BOOLEAN);
1
> SELECT cast(INTERVAL '1-2' YEAR TO MONTH AS INTEGER);
14
> SELECT cast(INTERVAL '1:30.5' MINUTE TO SECOND AS DECIMAL(5, 2));
90.50
> SELECT cast(TRUE AS INT);
1
> SELECT cast(FALSE AS INT);
0
> SELECT cast('15'::VARIANT AS INT);
15
STRING
Если targetType
является типом STRING, а sourceExpr
— типом:
-
Результатом является
NULL
строка. -
Результатом будет литеральное число с необязательным знаком минуса и без начальных нулей, за исключением одной цифры слева от десятичной точки. Если
targetType
являетсяDECIMAL(p, s)
, в которомs
больше 0, добавляется десятичная точка и конечные нули для масштаба. -
Если абсолютное число меньше
10,000,000
и больше или равно0.001
, результат выражается без экспоненциального представления по меньшей мере с одной цифрой на обеих сторонах десятичной точки.В противном случае Azure Databricks использует мантиссу, за которой следует
E
и экспонент. Мантисса имеет необязательный начальный знак минуса, за которым следует одна цифра слева от десятичной точки, и минимальное число цифр больше нуля справа. Экспонента имеет необязательный начальный знак минуса. -
Если год находится в диапазоне от 9999 г. до нашей эры до 9999 г. нашей эры, результатом будет dateString в виде
-YYYY-MM-DD
иYYYY-MM-DD
соответственно.Для лет за рамками этого диапазона к компоненту года добавляется необходимое число цифр, при этом для нашей эры используется
+
. -
Если год находится в диапазоне от 9999 г. до нашей эры до 9999 г. нашей эры, результатом будет timestampString в виде
-YYYY-MM-DD hh:mm:ss
иYYYY-MM-DD hh:mm:ss
соответственно.Для лет за рамками этого диапазона к компоненту года добавляется необходимое число цифр, при этом для нашей эры используется
+
.При необходимости добавляются доли секунд
.f...
. -
Если год находится в диапазоне от 9999 г. до нашей эры до 9999 г. нашей эры, результатом будет timestampString в виде
-YYYY-MM-DD hh:mm:ss
иYYYY-MM-DD hh:mm:ss
соответственно.Для лет за рамками этого диапазона к компоненту года добавляется необходимое число цифр, при этом для нашей эры используется
+
.При необходимости добавляются доли секунд
.f...
. -
Результатом будет его самое краткое представление для литерала интервала. Если интервал отрицательный, знак вставляется в
interval-string
. Для единиц меньше 10 начальные нули опускаются.Типичная строка year-month interval имеет следующий вид:
INTERVAL 'Y' YEAR
INTERVAL 'Y-M' YEAR TO MONTH
INTERVAL 'M' MONTH
-
Результатом будет его самое краткое представление для литерала интервала. Если интервал отрицательный, знак вставляется в
interval-string
. Для единиц меньше 10 начальные нули опускаются.Типичная строка day-time interval имеет следующий вид:
INTERVAL 'D' DAY
INTERVAL 'D h' DAY TO HOUR
INTERVAL 'D h:m' DAY TO MINUTE
INTERVAL 'D h:m:s' DAY TO SECOND
INTERVAL 'h' HOUR
INTERVAL 'h:m' HOUR TO MINUTE
INTERVAL 'm:s' MINUTE TO SECOND
INTERVAL 's' SECOND
-
Результатом
true
логическое значение являетсяSTRING
литералtrue
. Дляfalse
него является литералfalse
STRING. ДляNULL
нее имеется строка NULL. -
Результатом будет двоичное свойство
sourceExpr
, которое интерпретируется как последовательность символов UTF-8.Azure Databricks не проверяет символы UTF-8. Приведение от
BINARY
кSTRING
не внедряет символы подстановки и не выдает ошибки. -
Результатом будет разделенный запятыми список приведенных элементов, которые заключаются в фигурные скобки
[ ]
. За каждой запятой следует один пробел. ЭлементNULL
преобразуется в литералnull
.Azure Databricks не содержит кавычки или помечает отдельные элементы, которые могут содержать скобки или запятые.
-
Результатом будет разделенный запятыми список приведенных пар "ключ — значение", которые заключаются в фигурные скобки
{ }
. За каждой запятой следует один пробел. Каждая пара "ключ — значение" разделяется->
. Значение сопоставленияNULL
преобразуется в литералnull
.Azure Databricks не содержит кавычки или помечает отдельные ключи или значения, которые могут содержать фигурные скобки, запятые или
->
значения. -
Результатом будет разделенный запятыми список значений поля приведения, которые заключаются в фигурные скобки
{ }
. За каждой запятой следует один пробел. Значение поляNULL
преобразуется в литеральное значениеnull
.Azure Databricks не цитирует или помечает отдельные значения полей, которые могут содержать фигурные скобки или запятые.
-
Правила типа фактического
VARIANT
значения типа применяются.
Примеры
> SELECT cast(NULL AS STRING);
NULL
> SELECT cast(-3Y AS STRING);
-3
> SELECT cast(5::DECIMAL(10, 5) AS STRING);
5.00000
> SELECT cast(12345678e-4 AS STRING);
1234.5678
> SELECT cast(1e7 as string);
1.0E7
> SELECT cast(1e6 as string);
1000000.0
> SELECT cast(1e-4 as string);
1.0E-4
> SELECT cast(1e-3 as string);
0.001
> SELECT cast(12345678e7 AS STRING);
1.2345678E14
> SELECT cast(DATE'1900-12-31' AS STRING);
1900-12-31
-- Caesar no more
> SELECT cast(DATE'-0044-03-15' AS STRING);
-0044-03-15
> SELECT cast(DATE'100000-12-31' AS STRING);
+100000-12-31
> SELECT cast(current_timestamp() AS STRING);
2022-04-02 22:29:09.783
> SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING);
2023-01-01 00:00:00
> SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING);
INTERVAL '-13-2' YEAR TO MONTH
> SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING);
INTERVAL '12:04.99' MINUTE TO SECOND
> SELECT cast(true AS STRING);
true
> SELECT cast(false AS STRING);
false
-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
3�3
> SELECT hex(cast(x'33800033' AS STRING));
33800033
> SELECT cast(array('hello', NULL, 'world') AS STRING);
[hello, null, world]
> SELECT cast(array('hello', 'wor, ld') AS STRING);
[hello, wor, ld]
> SELECT cast(array() AS STRING);
[]
> SELECT cast(map('hello', 1, 'world', null) AS STRING);
{hello -> 1, world -> null}
> SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING);
{hello -> 1 -> 2022-01-01}
> SELECT cast(map() AS STRING);
{}
> SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING);
{5, 6, null}
> SELECT cast(named_struct() AS STRING);
{}
> SELECT cast(DATE'2024-01-05'::VARIANT AS STRING);
2024-01-05
DATE
Если targetType
является типом DATE, а sourceExpr
— типом:
-
Результатом является
NULL
DATE
. -
sourceExpr
должно быть допустимым значением dateString.Если
sourceExpr
это недопустимоdateString
, Azure Databricks возвращает ошибку.Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в
NULL
. -
Результатом будет часть даты
sourceExpr
для timestamp. -
Результатом является часть даты timestamp_ntz
sourceExpr
. -
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных.
Примеры
> SELECT cast(NULL AS DATE);
NULL
> SELECT cast('1900-10-01' AS DATE);
1900-10-01
> SELECT cast('1900-10-01' AS DATE);
1900-10-01
-- There is no February 30.
> SELECT cast('1900-02-30' AS DATE);
Error
> SELECT cast(TIMESTAMP'1900-10-01 12:13:14' AS DATE);
1900-10-01
> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14' AS DATE);
1900-10-01
> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14'::VARIANT AS DATE);
1900-10-01
TIMESTAMP
Если targetType
является типом TIMESTAMP, а sourceExpr
— типом:
-
Результатом является
NULL
DATE
. -
sourceExpr
считывается как число секунд с1970-01-01 00:00:00 UTC
.Дроби меньше микросекунды усекаются.
Если значение не входит в диапазон
TIMESTAMP
, возникает ошибка переполнения.Используйте try_cast, чтобы преобразовать ошибки переполнения в
NULL
. -
sourceExpr
должно быть допустимым значением timestampString.Если
sourceExpr
это недопустимоtimestampString
, Azure Databricks возвращает ошибку.Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в
NULL
. -
Результатом является
sourceExpr
DATE
час00:00:00
.
Результатом является значение метки времени с тем же годом/ месяцем/днем/часом/минутой/секундой timestamp_ntz sourceExpr
.
-
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных.
Примеры
> SELECT cast(NULL AS TIMESTAMP);
NULL
> SET TIME ZONE '+00:00';
> SELECT cast(0.0 AS TIMESTAMP);
1970-01-01 00:00:00
> SELECT cast(0.0000009 AS TIMESTAMP);
1970-01-01 00:00:00
> SELECT cast(1e20 AS TIMESTAMP);
Error: overflow
> SELECT cast('1900' AS TIMESTAMP);
1900-01-01 00:00:00
> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP);
1900-10-01 12:13:14
> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP);
Error
> SELECT cast(DATE'1900-10-01' AS TIMESTAMP);
1900-10-01 00:00:00
> SELECT cast(TIMESTAMP_NTZ'2023-01-01 02:03:04.567' as TIMESTAMP)
2023-01-01 02:03:04.567
> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP);
1900-10-01 00:00:00
TIMESTAMP_NTZ
targetType
Если тип TIMESTAMP_NTZ и sourceExpr
имеет тип:
-
Результатом является
NULL
DATE
. -
sourceExpr
должно быть допустимым значением timestampString.Если
sourceExpr
это недопустимоtimestampString
, Azure Databricks возвращает ошибку.Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в
NULL
. -
Результатом будет DATE для
sourceExpr
в00:00:00
ч. -
Результатом является локальное время в часовом
sourceExpr
поясе сеанса. -
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных.
Примеры
> SELECT cast(NULL AS TIMESTAMP_NTZ);
NULL
> SELECT cast('1900' AS TIMESTAMP_NTZ);
1900-01-01 00:00:00
> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP_NTZ);
1900-10-01 12:13:14
> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP_NTZ);
Error
> SELECT cast(DATE'1900-10-01' AS TIMESTAMP_NTZ);
1900-10-01 00:00:00
> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28' as TIMESTAMP_NTZ);
America/Los_Angeles 2021-07-01 08:43:28
> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28UTC+3' as TIMESTAMP_NTZ);
America/Los_Angeles 2021-06-30 22:43:28
> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP_NTZ);
1900-10-01 00:00:00
Интервал месяцев года
Если targetType
является типом year-month interval, а sourceExpr
— типом:
-
Результатом является годовой
NULL
интервал. -
Область применения: Databricks SQL Databricks Runtime 11.3 LTS и выше
Числовое значение интерпретируется как число нижних единиц
targetType
годаmonthIntervalQualifier. -
sourceExpr
должно быть допустимым значением yearMonthIntervalString.Если
sourceExpr
это недопустимоyearMonthIntervalString
, Azure Databricks возвращает ошибку.Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в
NULL
. -
targetType
Если yearMonthIntervalQualifier содержитMONTH
значение остается неизменным, но переосмыслено для соответствия целевому типу.В противном случае yearMonthIntervalQualifier исходного типа включает
MONTH
, а результат усекается до целого числа лет.
Примеры
> SELECT cast(NULL AS INTERVAL YEAR);
NULL
> SELECT cast('1-4' AS INTERVAL YEAR TO MONTH)::STRING;
INTERVAL '1-4' YEAR TO MONTH
> SELECT cast('1' AS INTERVAL YEAR TO MONTH);
error
> SELECT cast(INTERVAL '1-4' YEAR TO MONTH AS INTERVAL MONTH)::STRING;
INTERVAL '16' MONTH
> SELECT cast(14 AS INTERVAL YEAR TO MONTH)::STRING;
INTERVAL '1-2' YEAR TO MONTH
> SELECT cast(INTERVAL '1-11' YEAR TO MONTH AS INTERVAL YEAR)::STRING;
INTERVAL '1' YEAR
Интервал времени дня
Если targetType
является типом day-time interval, а sourceExpr
— типом:
-
Результатом является
NULL
интервал дня. -
Область применения: Databricks SQL Databricks Runtime 11.3 LTS и выше
Числовое значение интерпретируется как число нижних единиц
targetType
dayTimeIntervalQualifier. Если единицей являетсяSECOND
, доли интерпретируются как доли секунды. -
Значением свойства
sourceExpr
должна быть допустимая строка dayTimeIntervalString.Если
sourceExpr
это недопустимоdayTimeIntervalString
, Azure Databricks возвращает ошибку.Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в
NULL
. -
Если dayTimeIntervalQualifier
targetType
включает наименьшую единицу исходного типа dayTimeIntervalQualifier, значение остается неизменным, но переосмыслено для соответствия целевому типу.В противном случае интервал
sourceExpr
усекается для обеспечения соответствияtargetType
.
> SELECT cast(NULL AS INTERVAL HOUR);
NULL
> SELECT cast('1 4:23' AS INTERVAL DAY TO MINUTE)::STRING;
INTERVAL '1 04:23' DAY TO MINUTE
> SELECT cast('1' AS INTERVAL DAY TO MINUTE);
error
> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL MINUTE)::STRING;
INTERVAL '1703' MINUTE
> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL HOUR)::STRING;
INTERVAL '28' HOUR
> SELECT cast(125.3 AS INTERVAL MINUTE TO SECOND)::STRING;
INTERVAL '2:5.3' MINUTE TO SECOND
BOOLEAN
Если targetType
является типом BOOLEAN, а sourceExpr
— типом:
-
Результатом является
NULL
типBOOLEAN
. -
Если
sourceExpr
равно:0
— результатом будетfalse
.NULL
— результатом будетNULL
.special floating point value
— результатом будетtrue
.
В противном случае результат будет
true
.
-
Если
sourcEexpr
имеет значение (без учета регистра):'T', 'TRUE', 'Y', 'YES', or '1'
— результатом будетtrue
.'F', 'FALSE', 'N', 'NO', or '0'
— результатом будетfalse
.NULL
— результатом будетNULL
.
В противном случае Azure Databricks возвращает недопустимый синтаксис ввода для логической ошибки типа.
Используйте try_cast, чтобы преобразовать ошибки о недопустимых данных в
NULL
. -
Правила типа фактического
VARIANT
значения типа применяются.
Примеры
> SELECT cast(NULL AS BOOLEAN);
NULL
> SELECT cast('T' AS BOOLEAN);
true
> SELECT cast('True' AS BOOLEAN);
true
> SELECT cast('1' AS BOOLEAN);
true
> SELECT cast('0' AS BOOLEAN);
false
> SELECT cast('n' AS BOOLEAN);
false
> SELECT cast('on' AS BOOLEAN);
error: invalid input syntax for type boolean
> SELECT cast(0 AS BOOLEAN);
false
> SELECT cast(0.0E10 AS BOOLEAN);
false
> SELECT cast(1 AS BOOLEAN);
true
> SELECT cast(0.1 AS BOOLEAN);
true
> SELECT cast('NaN'::FLOAT AS BOOLEAN);
true
> SELECT cast(1::VARIANT AS BOOLEAN);
true
BINARY
Если targetType
является типом BINARY, а sourceExpr
— типом:
-
Результатом является
NULL
типBINARY
. -
Результатом будет кодирование UTF-8 для
surceExpr
. -
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных.
Примеры
> SELECT cast(NULL AS BINARY);
NULL
> SELECT hex(cast('Spark SQL' AS BINARY));
537061726B2053514C
> SELECT hex(cast('Oдesa' AS BINARY));
4FD0B4657361
> SELECT hex(cast('Oдesa'::VARIANT AS BINARY));
4FD0B4657361
ARRAY
targetType
Если объект ARRAY < targetElementType > имеет sourceExpr
тип:
-
Результатом является
NULL
targeType
результат . -
Если приведение
sourceElementType
кtargetElementType
поддерживается, результатом будетARRAY<targetElementType>
, в котором все элементы приведены кtargetElementType
.Azure Databricks вызывает ошибку, если приведение не поддерживается или если ни один из элементов не может быть приведение.
Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в
NULL
. -
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных.
Примеры
> SELECT cast(NULL AS ARRAY<INT>);
NULL
> SELECT cast(array('t', 'f', NULL) AS ARRAY<BOOLEAN>);
[true, false, NULL]
> SELECT cast(array('t', 'f', NULL) AS INTERVAL YEAR);
error: cannot cast array<string> to interval year
> SELECT cast(array('t', 'f', 'o') AS ARRAY<BOOLEAN>);
error: invalid input syntax for type boolean: o.
> SELECT cast(array('t', 'f', NULL)::VARIANT AS ARRAY<BOOLEAN>);
[true, false, NULL]
MAP
targetType
Если используется map < targetKeyType, targetValueType > и sourceExpr
имеет тип:
-
Результатом является
NULL
targetType
результат . MAP <sourceKeyType, sourceValueType >
Если приведения от
sourceKeyType
кtargetKeyType
иsourceValueType
кtargetValueType
поддерживаются, результатом будетMAP<targetKeyType, targetValueType>
, в котором все ключи приведены кtargetKeyType
, а все значения — кtargetValueType
.Azure Databricks вызывает ошибку, если приведение не поддерживается или если ни один из ключей или значений не может быть приведение.
Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в
NULL
.-
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных. OBJECT < [sourceFieldName: sourceFieldType [, ...]] >
Каждый
sourceFieldName
типSTRING
сопоставляется сtargetKeyType
ключом карты и сопоставляется с ней. Каждое исходноеsourceFieldType
значение поля приведениеtargetValueType
и сопоставлено соответствующее значение карты.Azure Databricks вызывает ошибку, если какие-либо приведения не поддерживаются или если какие-либо из значений полей или ключевых значений не могут быть приведение.
Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в
NULL
.
Примеры
> SELECT cast(NULL AS MAP<STRING, INT>);
NULL
> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, BOOLEAN>);
{10 -> true, 15 -> false, 20 -> null}
> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, ARRAY<INT>>);
error: cannot cast map<string,string> to map<int,array<int>>
> SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS MAP<INT, BOOLEAN>);
error: invalid input syntax for type boolean: o.
-- Casting an OBJECT to a MAP
> SELECT schema_of_variant(parse_json('{"cars": 12, "bicycles": 5 }'));
OBJECT<bicycles: BIGINT, cars: BIGINT>
> SELECT CAST(parse_json('{"cars": 12, "bicycles": 5 }') AS MAP<STRING, INTEGER>);
{bicycles -> 5, cars -> 12}
STRUCT
targetType
Если используется STRUCT <[targetFieldName: targetFieldType [NOT NULL] [COMMENT str] [, ...]] > и sourceExpr
имеет тип:
-
Результатом является
NULL
targetType
результат . STRUCT < [sourceFieldName: sourceFieldType [NOT NULL] [COMMENT str] [, ...]] >
Можно
sourceExpr
привести к приведенияtargetType
, если все эти условия являются истинными:- Тип источника имеет такое же количество полей, что и целевой объект.
- Для всех полей
sourceFieldTypeN
можно привести кtargetFieldTypeN
. - Для всех значений полей значение N исходного поля можно привести к
targetFieldTypeN
, при этом значение не равно NULL, если целевое поле N помечено какNOT NULL
.
Значения
sourceFieldName
, ограниченияNOT NULL
источника иCOMMENT
источника не обязаны соответствоватьtargetType
и игнорируются.Azure Databricks вызывает ошибку, если приведение не поддерживается или если какие-либо поля не могут быть приведения.
Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в
NULL
.-
Правила типов для фактического значения, удерживаемого типом
VARIANT
данных. OBJECT < [sourceFieldName: sourceFieldType [, ...]] >
Все
sourceFieldName
s совпадают сsourceFieldName
s. Каждое исходное значениеsourceFieldType
поля приводится к сопоставленнойtargetValueType
и сопоставленной с соответствующим значением карты.targetFieldName
Если значение поля не совпадает, значение поля равноNULL
.sourceFieldName
Если значение не совпадает, поле игнорируется.Azure Databricks вызывает ошибку, если какие-либо приведения не поддерживаются или если какие-либо из значений полей или ключевых значений не могут быть приведение.
Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в
NULL
.
Примеры
> SELECT cast(NULL AS STRUCT<a:INT>);
NULL
> SELECT cast(named_struct('a', 't', 'b', '1900-01-01') AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
{"b":true,"c":1900-01-01}
> SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
error: cannot cast struct<a:string,b:date> to struct<b:boolean,c:date>
> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:ARRAY<INT>>);
error: cannot cast struct<a:string,b:string> to struct<b:boolean,c:array<int>>
> SELECT cast(named_struct('a', 't', 'b', 'hello') AS STRUCT<b:BOOLEAN, c:DATE>);
error: Cannot cast hello to DateType
> SELECT cast(named_struct('a', 't', 'b', '1900-01-01')::VARIANT AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
{"b":true,"c":1900-01-01}
-- Casting an OBJECT to a STRUCT
> SELECT schema_of_variant(parse_json('{"name": "jason", "age": 25 }'));
OBJECT<age: BIGINT, name: STRING>
> SELECT CAST(parse_json('{"name": "jason", "age": 25 }') AS STRUCT<id: BIGINT, name: STRING>);
{"id":null,"name":"jason"}
VARIANT
targetType
Если используется вариант VARIANT и sourceExpr
имеет тип:
-
Результатом является
NULL
типVARIANT
. -
Результатом является значение
VARIANT
, представляющее числовое значение.DECIMAL
Точность типов должна иметь значение <= 38.Все целочисленные числовые значения сопоставляются с
BIGINT
.Все
DECIMAL
значения сопоставляются с самой узкой точностью и масштабом. -
Результатом является значение
VARIANT
, представляющееSTRING
значение. -
Результатом является значение
VARIANT
, представляющееDATE
значение. -
Результатом является значение
VARIANT
, представляющееTIMESTAMP
значение. -
Результатом является значение
VARIANT
, представляющееTIMESTAMP NTZ
значение. -
Результатом является значение
VARIANT
, представляющееBOOLEAN
значение. -
Результатом является значение
VARIANT
, представляющееBINARY
значение. -
Если приведение поддерживается
sourceElementType
VARIANT
, результатом являетсяVARIANT
, представляющийARRAY<sourceElementType>
.Azure Databricks вызывает ошибку, если приведение не поддерживается.
Используйте try_cast, чтобы преобразовать недопустимые данные или ошибки переполнения в
NULL
.
Примеры
> SELECT cast(NULL AS VARIANT);
NULL
> SELECT cast(5.1000 AS VARIANT);
5.1
> SELECT schema_of_variant(cast(5 AS VARIANT));
BIGINT