- 类别:
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要将表达式转换为的数据类型。如果数据类型支持其他属性,例如 :ref:`总位数和小数位数 <label-data_types_numeric__precision_and_scale>`(用于数字/小数),则可以包含这些属性。
RENAME FIELDS对于 结构化 OBJECTs,指定要更改 OBJECT 以使用不同的键值对。原始对象中的值将按其出现的顺序复制到新的键值对中。
有关示例,请参阅 示例:更改 OBJECT 值中的键名称。
ADD FIELDS对于 结构化 OBJECTs,指定要将键值对添加到 OBJECT。
有关示例,请参阅 示例:向 OBJECT 值添加键。
新添加的键的值将设置为 NULL。如果要为这些键赋值,请改为调用 OBJECT_INSERT 函数。
使用说明¶
如果小数位数不足以容纳输入值,则函数将对值进行四舍五入。
如果总位数不足以容纳输入值,则函数会引发错误。
在将数据卸载到 Parquet 文件时,如果明确地将数值列转换为整数数据类型,则这些列在 Parquet 文件中的数据类型为 INT。有关更多信息,请参阅 将数值列显式转换为 Parquet 数据类型。
Collation specifications aren't retained when values to are cast to text string data types (for example, VARCHAR and STRING). You can include collation specifications when you cast values (for example,
CAST(myvalue AS VARCHAR) COLLATE 'en-ai').当您使用
::替代语法时,您不能指定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[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] |
+-------------------+-----------+