类型转换函数
数值类型转换常见的问题
当你把一个值从一个类型转换为另外一个类型的时候,你需要注意的是这是一个不安全的操作,可能导致数据的丢失。数据丢失一般发生在你将一个大的数据类型转换为小的数据类型的时候,或者你把两个不同的数据类型相互转换的时候。
ClickHouse和 C++ 有相同的类型转换行为。
toInt(8 | 16 | 32 | 64)
转换一个输入值为 Int 类型。这个函数包括:
-
toInt8(expr)
— 结果为Int8
数据类型。 -
toInt16(expr)
— 结果为Int16
数据类型。 -
toInt32(expr)
— 结果为Int32
数据类型。 -
toInt64(expr)
— 结果为Int64
数据类型。
参数
-
expr
— 表达式 返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。
返回值
整形在
Int8
,
Int16
,
Int32
,或者
Int64
的数据类型。
函数使用 rounding towards zero 原则,这意味着会截断丢弃小数部分的数值。
NaN and Inf 转换是不确定的。具体使用的时候,请参考 数值类型转换常见的问题 。
例子
SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8)
┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ -9223372036854775808 │ 32 │ 16 │ 8 │
└──────────────────────┴─────────────┴───────────────┴─────────────┘
toInt(8 | 16 | 32 | 64)OrZero
这个函数需要一个字符类型的入参,然后尝试把它转为
Int (8 | 16 | 32 | 64)
,如果转换失败直接返回0。
例子
select toInt64OrZero('123123'), toInt8OrZero('123qwe123')
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐
│ 123123 │ 0 │
└─────────────────────────┴───────────────────────────┘
toInt(8 | 16 | 32 | 64)OrNull
这个函数需要一个字符类型的入参,然后尝试把它转为
Int (8 | 16 | 32 | 64)
,如果转换失败直接返回
NULL
。
例子
select toInt64OrNull('123123'), toInt8OrNull('123qwe123')
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐
│ 123123 │ ᴺᵁᴸᴸ │
└─────────────────────────┴───────────────────────────┘
toUInt(8 | 16 | 32 | 64)
转换一个输入值到 UInt 类型。 这个函数包括:
-
toUInt8(expr)
— 结果为UInt8
数据类型。 -
toUInt16(expr)
— 结果为UInt16
数据类型。 -
toUInt32(expr)
— 结果为UInt32
数据类型。 -
toUInt64(expr)
— 结果为UInt64
数据类型。
参数
-
expr
— 表达式 返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。
返回值
整形在
UInt8
,
UInt16
,
UInt32
,或者
UInt64
的数据类型。
函数使用 rounding towards zero 原则,这意味着会截断丢弃小数部分的数值。
对于负数和
NaN and Inf
来说转换的结果是不确定的。如果你传入一个负数,比如:
'-32'
,ClickHouse会抛出异常。具体使用的时候,请参考
数值类型转换常见的问题
。
例子
SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8)
┌───────toUInt64(nan)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│ 9223372036854775808 │ 4294967264 │ 16 │ 8 │
└─────────────────────┴───────────────┴────────────────┴──────────────┘
toUInt(8 | 16 | 32 | 64)OrZero
toUInt(8 | 16 | 32 | 64)OrNull
toFloat(32 | 64)
toFloat(32 | 64)OrZero
toFloat(32 | 64)OrNull
toDate
toDateOrZero
toDateOrNull
toDateTime
toDateTimeOrZero
toDateTimeOrNull
toDecimal(32 | 64 | 128)
转换
value
到
Decimal
类型的值,其中精度为
S
。
value
可以是一个数字或者一个字符串。
S
指定小数位的精度。
-
toDecimal32(value, S)
-
toDecimal64(value, S)
-
toDecimal128(value, S)
toDecimal(32 | 64 | 128)OrNull
转换一个输入的字符到 Nullable(Decimal(P,S)) 类型的数据。这个函数包括:
-
toDecimal32OrNull(expr, S)
— 结果为Nullable(Decimal32(S))
数据类型。 -
toDecimal64OrNull(expr, S)
— 结果为Nullable(Decimal64(S))
数据类型。 -
toDecimal128OrNull(expr, S)
— 结果为Nullable(Decimal128(S))
数据类型。
如果在解析输入值发生错误的时候你希望得到一个
NULL
值而不是抛出异常,你可以使用该函数。
参数
返回值
Nullable(Decimal(P,S))
类型的数据,包括:
-
如果有的话,小数位
S
。 -
如果解析错误或者输入的数字的小数位多于
S
,那结果为NULL
。
例子
SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val)
┌────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐
│ -1.111 │ Nullable(Decimal(9, 5)) │
└────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(val)
┌──val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐
│ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │
└──────┴────────────────────────────────────────────────────┘
toDecimal(32 | 64 | 128)OrZero
转换输入值为 Decimal(P,S) 类型数据。这个函数包括:
-
toDecimal32OrZero( expr, S)
— 结果为Decimal32(S)
数据类型。 -
toDecimal64OrZero( expr, S)
— 结果为Decimal64(S)
数据类型。 -
toDecimal128OrZero( expr, S)
— 结果为Decimal128(S)
数据类型。
当解析错误的时候,你不需要抛出异常而希望得到
0
值,你可以使用该函数。
参数
返回值
A value in the
Nullable(Decimal(P,S))
data type. The value contains:
-
如果有的话,小数位
S
。 -
如果解析错误或者输入的数字的小数位多于
S
,那结果为小数位精度为S
的0
。 例子
SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val)
┌────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐
│ -1.111 │ Decimal(9, 5) │
└────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val)
┌──val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐
│ 0.00 │ Decimal(9, 2) │
└──────┴────────────────────────────────────────────────────┘
toString
这些函数用于在数字、字符串(不包含FixedString)、Date以及DateTime之间互相转换。 所有的函数都接受一个参数。
当将其他类型转换到字符串或从字符串转换到其他类型时,使用与TabSeparated格式相同的规则对字符串的值进行格式化或解析。如果无法解析字符串则抛出异常并取消查询。
当将Date转换为数字或反之,Date对应Unix时间戳的天数。