- 类别:
CAST、::
¶
将一种数据类型的值转换为另一种数据类型。CAST 的语义与相应的 TO_ datatype
转换函数的语义相同。如果无法进行转换,则会引发错误。有关更多详细信息,请参阅各个 TO_ datatype
转换函数。有关数据类型转换和 TO_ datatype
转换函数的更多信息,请参阅 数据类型转换。
::
运算符为 CAST 提供替代语法。
- 另请参阅:
语法¶
CAST( <source_expr> AS <target_data_type> )
[ RENAME FIELDS | ADD FIELDS ]
<source_expr> :: <target_data_type>
实参¶
source_expr
要转换为其他数据类型的任何受支持数据类型的表达式。
target_data_type
要将表达式转换为的数据类型。如果数据类型支持其他属性,例如 总位数和小数位数 (用于数字/小数),则可以包含这些属性。
RENAME FIELDS
对于 结构化 OBJECTs,指定要更改 OBJECT 以使用不同的键值对。原始对象中的值将按其出现的顺序复制到新的键值对中。
有关示例,请参阅 示例:更改 OBJECT 中的键名称。
ADD FIELDS
对于 结构化 OBJECTs,指定要将键值对添加到 OBJECT。
有关示例,请参阅 示例:向 OBJECT 添加键。
新添加的键的值将设置为 NULL。如果要为这些键赋值,请改为调用 OBJECT_INSERT 函数。
使用说明¶
如果小数位数不足以容纳输入值,则函数将对值进行四舍五入。
如果总位数不足以容纳输入值,则函数会引发错误。
在将数据卸载到 Parquet 文件时,如果明确地将数值列转换为整数数据类型,则这些列在 Parquet 文件中的数据类型为 INT。有关更多信息,请参阅 将数值列显式转换为 Parquet 数据类型。
当您使用
::
替代语法时,您不能指定RENAME FIELDS
或ADD FIELDS
实参。
示例¶
CAST 示例使用下表中的数据:
CREATE OR REPLACE TABLE test_data_type_conversion (
varchar_value VARCHAR,
number_value NUMBER(5, 4),
timestamp_value TIMESTAMP);
INSERT INTO test_data_type_conversion VALUES (
'9.8765',
1.2345,
'2024-05-09 14:32:29.135 -0700');
SELECT * FROM test_data_type_conversion;
+---------------+--------------+-------------------------+
| VARCHAR_VALUE | NUMBER_VALUE | TIMESTAMP_VALUE |
|---------------+--------------+-------------------------|
| 9.8765 | 1.2345 | 2024-05-09 14:32:29.135 |
+---------------+--------------+-------------------------+
这些示例使用 SYSTEM$TYPEOF 函数显示转换值的数据类型。
将字符串转换为具有指定小数位数 (2) 的数字:
SELECT CAST(varchar_value AS NUMBER(5,2)) AS varchar_to_number1,
SYSTEM$TYPEOF(varchar_to_number1) AS data_type
FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER1 | DATA_TYPE |
|--------------------+------------------|
| 9.88 | NUMBER(5,2)[SB4] |
+--------------------+------------------+
使用 ::
符号将相同的字符串转换为小数位数为 5 的数字:
SELECT varchar_value::NUMBER(6,5) AS varchar_to_number2,
SYSTEM$TYPEOF(varchar_to_number2) AS data_type
FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER2 | DATA_TYPE |
|--------------------+------------------|
| 9.87650 | NUMBER(6,5)[SB4] |
+--------------------+------------------+
将数字转换为整型。对于整型,无法指定精度和小数位数,因此默认值始终为 NUMBER(38, 0)。
SELECT CAST(number_value AS INTEGER) AS number_to_integer,
SYSTEM$TYPEOF(number_to_integer) AS data_type
FROM test_data_type_conversion;
+-------------------+-------------------+
| NUMBER_TO_INTEGER | DATA_TYPE |
|-------------------+-------------------|
| 1 | NUMBER(38,0)[SB1] |
+-------------------+-------------------+
将数字转换为字符串:
SELECT CAST(number_value AS VARCHAR) AS number_to_varchar,
SYSTEM$TYPEOF(number_to_varchar) AS data_type
FROM test_data_type_conversion;
+-------------------+------------------------+
| NUMBER_TO_VARCHAR | DATA_TYPE |
|-------------------+------------------------|
| 1.2345 | VARCHAR(16777216)[LOB] |
+-------------------+------------------------+
将时间戳转换为日期:
SELECT CAST(timestamp_value AS DATE) AS timestamp_to_date,
SYSTEM$TYPEOF(timestamp_to_date) AS data_type
FROM test_data_type_conversion;
+-------------------+-----------+
| TIMESTAMP_TO_DATE | DATA_TYPE |
|-------------------+-----------|
| 2024-05-09 | DATE[SB4] |
+-------------------+-----------+