数据类型转换
显式转型
有两种表达式可以将值转换到另一个数据类型。
CAST
函数,如果在类型转换过程中发生错误,则会抛出错误。
Databend 还支持 PostgreSQL 风格的类型转换: CAST(c as INT)
与 c::Int
相同
TRY_CAST
函数,如果在类型转换过程中发生错误,则返回 NULL 。
隐式转换(强制)
关于「强制」的一些基本规则(自动转换)
- 所有整数数据类型都可以隐式转换到
BIGINT
(也就是INT64
) 数据类型。
例如:
Int --> bigint
UInt8 --> bigint
Int32 --> bigint
- 所有数字数据类型都可以隐式转换到
Double
(也就是Float64
) 数据类型。
例如:
Int --> Double
Float --> Double
Int32 --> Double
- 所有不可为空的数据类型
T
可以隐式转换到Nullable(T)
数据类型。
例如:
Int --> Nullable<Int>
String --> Nullable<String>
- 所有数据类型都可以隐式转换到
Variant
数据类型。
例如:
Int --> Variant
- 字符串数据类型是最低的数据类型,不能隐式转换到其他数据类型。
Array<T>
-->Array<U>
ifT
-->U
.Nullable<T>
-->Nullable<U>
ifT
-->U
.Null
-->Nullable<T>
for anyT
datatype.- 如果没有空档,数字可以隐式转换到其他数字数据类型。
常见问题
为什么数字类型不能自动转换为字符串类型。
看上去实现这一点并不困难,甚至其他流行数据库也支持这种做法。 但它会造成含糊不清。
例如:
select 39 > '301';
select 39 = ' 39 ';
我们无法清楚如何将其与数字规则或字符串规则进行比较。 依据不同的规则,会产生不同的结果。
select 39 > 301
的结果是 false ,而 select '39' > '301'
的结果是 true 。
为了使语法更加精确并减少歧义,Databend 会将错误抛出给用户以获得更精确的 SQL 。
为什么不能自动将布尔类型转换为数字类型。
这也会造成含糊不清。 例如:
select true > 0.5;
错误消息:“无法从 nullable 数据类型转换到不可为空类型” 意味着什么?
这意味着你的源列中存在空值。 你可以使用 TRY_CAST
函数或令你的目标类型为可为空类型。
select concat(1, col)
无法按预期工作
你可以将 SQL 改为 select concat('1', col)
我们可能会在未来改进表达式,在可行的情况下,将会允许将字面量 1
解析为字符串值(concat
函数只接受字符串参数)。