适用于:
Databricks SQL
Databricks Runtime
将值 expr 强制转换为目标数据类型 type。 此运算符是 ::(双冒号)运算符的同义词
语法
cast(sourceExpr AS targetType)
参数
-
sourceExpr:任何可强制转换的表达式。 -
targetType:结果的数据类型。
返回
结果为类型 targetType。
以下数据类型强制转换组合有效:
| 源(行)目标(列) | 空白 | 数值 | 字符串 | DATE | 时间戳 | TIMESTAMP_NTZ | 年-月区间 | 白天时间间隔 | 布尔 | 二进制 | 数组 | 地图 | 结构 | 变体 | 对象 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 空白 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | N |
| 数值 | N | Y | Y | N | Y | N | Y | Y | Y | N | N | N | N | Y | N |
| 字符串 | 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 |
| 时间戳 | 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 |
| 布尔 | N | Y | Y | N | Y | N | N | N | Y | N | N | N | N | Y | N |
| 二进制 | N | Y | Y | N | N | N | N | N | N | Y | N | N | N | Y | N |
| 数组 | N | N | Y | N | N | N | N | N | N | N | Y | N | N | Y | N |
| 地图 | N | N | Y | N | N | N | N | N | N | N | N | Y | N | N | N |
| 结构 | 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.enabled 为 false,则溢出不会导致错误,而是将结果“换行”。
对 sourceExpr 使用格式无效或包含无效字符的 targetType 值将导致 NULL。
数字
如果 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的范围,则引发溢出错误。使用 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
字符串
如果 sourceExpr 是 STRING,则生成的 STRING 会继承 sourceExpr 的排序规则。
在所有其他情况下,生成的 STRING 的排序规则是默认排序规则。
若要更改排序规则,请添加 collate 表达式。
如果targetType是STRING类型且sourceExpr是类型:
-
结果是
NULL字符串。 -
结果是带有可选减号且不带前导零(小数点左侧的单个数字除外)的文本数字。 如果
targetType是DECIMAL(p, s)且s大于 0,则添加小数点并将尾部零相加以得出标量。 -
如果绝对数小于
10,000,000且大于或等于0.001,则结果不使用科学记数法表示,小数点两侧至少包含一位数。否则,Azure Databricks 使用尾数,后接
E和一个指数。 尾数包含一个可选的前导减号,后接小数点左侧的一位数,以及右侧大于零的最小位数。 指数包含可选的前导减号。 -
如果年份介于公元前 9999 年和公元 9999 年之间,则结果分别为 和
-YYYY-MM-DD格式的YYYY-MM-DD。对于此范围之前或之后的年份,将必要的位数添加到年份组成部分,
+用于表示“公元”。 -
如果年份介于公元前 9999 年和公元 9999 年之间,则结果分别为 和
-YYYY-MM-DD hh:mm:ss格式的YYYY-MM-DD hh:mm:ss。对于此范围之前或之后的年份,将必要的位数添加到年份组成部分,
+用于表示“公元”。根据需要添加小数秒
.f...。 -
如果年份介于公元前 9999 年和公元 9999 年之间,则结果分别为 和
-YYYY-MM-DD hh:mm:ss格式的YYYY-MM-DD hh:mm:ss。对于此范围之前或之后的年份,将必要的位数添加到年份组成部分,
+用于表示“公元”。根据需要添加小数秒
.f...。 -
结果是间隔文本的最短表示形式。 如果间隔为负数,则在
interval-string中嵌入符号。 对于小于 10 的单位,将省略前导零。典型的年月间隔字符串采用以下格式:
INTERVAL 'Y' YEARINTERVAL 'Y-M' YEAR TO MONTHINTERVAL 'M' MONTH
-
结果是间隔文本的最短表示形式。 如果间隔为负数,则在
interval-string中嵌入符号。 对于小于 10 的单位,将省略前导零。典型的日期时间间隔字符串采用以下格式:
INTERVAL 'D' DAYINTERVAL 'D h' DAY TO HOURINTERVAL 'D h:m' DAY TO MINUTEINTERVAL 'D h:m:s' DAY TO SECONDINTERVAL 'h' HOURINTERVAL 'h:m' HOUR TO MINUTEINTERVAL 'm:s' MINUTE TO SECONDINTERVAL 's' SECOND
-
true布尔值的结果是STRING文本true。 如果布尔值为false,则结果为字符串字面量false。 如果布尔值为NULL,则结果为 NULL 字符串。 -
结果是解释为 UTF-8 字符序列的二进制
sourceExpr。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
> SELECT cast(5 AS STRING) COLLATE UNICODE;
5
日期
如果targetType是DATE类型且sourceExpr是类型:
-
结果是
NULLDATE。 -
sourceExpr必须是有效的 dateString。如果
sourceExpr不是有效的dateString,则 Azure Databricks 会返回错误。使用 try_cast 将无效数据错误转换为
NULL。 -
结果是时间戳
sourceExpr的日期部分。 -
结果是 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
时间戳
如果targetType是TIMESTAMP类型且sourceExpr是类型:
-
结果是
NULLDATE。 -
sourceExpr读取为自1970-01-01 00:00:00 UTC以来经过的秒数。小于微秒的小数部分将被截断。
如果值超出
TIMESTAMP的范围,则引发溢出错误。使用 try_cast 将溢出错误转换为
NULL。 -
sourceExpr必须是有效的 timestampString。如果
sourceExpr不是有效的timestampString,则 Azure Databricks 会返回错误。使用 try_cast 将无效数据错误转换为
NULL。 -
在
sourceExpr(小时)的结果是DATE00: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是类型:
-
结果是
NULLDATE。 -
sourceExpr必须是有效的 timestampString。如果
sourceExpr不是有效的timestampString,则 Azure Databricks 会返回错误。使用 try_cast 将无效数据错误转换为
NULL。 -
结果是
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 是年月间隔并且 sourceExpr 的类型为:
-
结果是
NULL的年月间隔。 -
适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本该数值解释为
targetTypeyearmonthIntervalQualifier 的低单位数。 -
sourceExpr必须是有效的 yearMonthIntervalString。如果
sourceExpr不是有效的yearMonthIntervalString,则 Azure Databricks 会返回错误。使用 try_cast 将无效数据错误转换为
NULL。 -
如果
targetTypeyearMonthIntervalQualifier 包含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 是日期时间间隔并且 sourceExpr 的类型为:
-
结果是
NULL的日期时间间隔。 -
适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本该数值解释为
targetTypedayTimeIntervalQualifier 的低单位数。 如果单位是SECOND,任何小数将解释为秒的小数形式。 -
sourceExpr必须是有效的 dayTimeIntervalString。如果
sourceExpr不是有效的dayTimeIntervalString,则 Azure Databricks 会返回错误。使用 try_cast 将无效数据错误转换为
NULL。 -
如果
targetTypedayTimeIntervalQualifier 包含源类型 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
布尔
如果 targetType 是布尔值并且 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
二进制
如果 targetType 是二进制值并且 sourceExpr 的类型为:
-
结果是类型
NULL为BINARY。 -
结果是
surceExpr的 UTF-8 编码。 -
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
数组
如果 targetType 是 ARRAY <> 并且 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]
地图
如果 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}
结构
如果 targetType 是 STRUCT <[targetFieldName : targetFieldType [NOT NULL] [COMMENT str] [, …]] > 并且 sourceExpr 的类型为:
-
结果是
NULL的targetType。 STRUCT < [sourceFieldName: sourceFieldType [NOT NULL] [COMMENT str] [,...]] >
如果满足以下所有条件,则
sourceExpr可以强制转换为targetType:- 源类型与目标具有相同数量的字段
- 对于所有字段:
sourceFieldTypeN可以强制转换为targetFieldTypeN。 - 对于所有字段值:源字段值 N 可以强制转换为
targetFieldTypeN,如果目标字段 N 标记为NOT NULL,则值不为 null。
sourceFieldName、源NOT NULL约束和源COMMENT不需要与targetType匹配,且将被忽略。如果不支持转换或无法转换任一字段,则 Azure Databricks 会引发错误。
使用 try_cast 将无效数据或溢出错误转换为
NULL。-
VARIANT数据类型保留的实际值的类型规则适用。 OBJECT < [sourceFieldName : sourceFieldType [, ...]] >
所有
sourceFieldName都与sourceFieldName匹配。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"}
变体
如果 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