跳转到主要内容

数据类型转换

显式转型

有两种表达式可以将值转换到另一个数据类型。

  1. CAST 函数,如果在类型转换过程中发生错误,则会抛出错误。

Databend 还支持 PostgreSQL 风格的类型转换: CAST(c as INT)c::Int 相同

  1. TRY_CAST 函数,如果在类型转换过程中发生错误,则返回 NULL 。

隐式转换(强制)

关于「强制」的一些基本规则(自动转换)

  1. 所有整数数据类型都可以隐式转换到 BIGINT (也就是 INT64) 数据类型。

例如:

Int --> bigint
UInt8 --> bigint
Int32 --> bigint
  1. 所有数字数据类型都可以隐式转换到 Double (也就是 Float64) 数据类型。

例如:

Int --> Double
Float --> Double
Int32 --> Double
  1. 所有不可为空的数据类型 T 可以隐式转换到 Nullable(T) 数据类型。

例如:

Int --> Nullable<Int>
String --> Nullable<String>
  1. 所有数据类型都可以隐式转换到 Variant 数据类型。

例如:

Int --> Variant
  1. 字符串数据类型是最低的数据类型,不能隐式转换到其他数据类型。
  2. Array<T> --> Array<U> if T --> U.
  3. Nullable<T> --> Nullable<U> if T--> U.
  4. Null --> Nullable<T> for any T datatype.
  5. 如果没有空档,数字可以隐式转换到其他数字数据类型。

常见问题

为什么数字类型不能自动转换为字符串类型。

看上去实现这一点并不困难,甚至其他流行数据库也支持这种做法。 但它会造成含糊不清。

例如:

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 函数只接受字符串参数)。