Clickhouse 类型转换函数实战总结
Posted 扫地增
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clickhouse 类型转换函数实战总结相关的知识,希望对你有一定的参考价值。
文章目录
- 数据精度丢失问题
- toInt(8|16|32|64) 转换一个输入值为Int类型
- toInt(8|16|32|64)OrZero
- toInt(8|16|32|64)OrNull
- toUInt(8|16|32|64) 转换一个输入值到UInt类型。
- 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)
- toDecimal(32|64|128)OrNull
- toDecimal(32|64|128)OrZero
- toString
- toFixedString(s,N)
- toStringCutToZero(s)
- reinterpretAsUInt(8|16|32|64)
- reinterpretAsInt(8|16|32|64)
- reinterpretAsFloat(32|64)
- reinterpretAsDate (s)
- reinterpretAsDateTime (s)
- reinterpretAsString(s)
- reinterpretAsFixedString (s)
- CAST(x, T)
- toInterval(Year|Quarter|Month|Week|Day|Hour|Minute|Second)
- parseDateTimeBestEffort
- parseDateTimeBestEffortOrNull
- parseDateTimeBestEffortOrZero
- toLowCardinality
- toUnixTimestamp64Milli、toUnixTimestamp64Micro、toUnixTimestamp64Nano
- fromUnixTimestamp64Milli、fromUnixTimestamp64Micro、fromUnixTimestamp64Nano
- 结语
数据精度丢失问题
当把一个值从一个类型转换为另外一个类型的时候,你需要注意的是这是一个不安全的操作,可能导致数据精度的丢失。数据精度丢失一般发生在你将一个大的数据类型转换为小的数据类型的时候,或者你把两个不同的数据类型相互转换的时候。
ClickHouse和C++有相同的类型转换行为。
toInt(8|16|32|64) 转换一个输入值为Int类型
函数说明:
toInt8(expr) — 结果为Int8数据类型。
toInt16(expr) — 结果为Int16数据类型。
toInt32(expr) — 结果为Int32数据类型。
toInt64(expr) — 结果为Int64数据类型。
- 参数:
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。 返回值- 返回值:
1、整形在Int8
,Int16
,Int32
,或者Int64
的数据类型。
2、函数使用rounding towards zero
原则,这意味着会截断丢弃小数部分的数值。
3、NaN
和Inf
转换是不确定的。具体使用的时候,请参考数值类型转换常见的问题。
函数实例:
localhost :) SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8)
SELECT
toInt64(nan),
toInt32(32),
toInt16('16'),
toInt8(8.8)
Query id: 8ecc59d4-598a-44c5-86ac-bb495c73a17f
┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ -9223372036854775808 │ 32 │ 16 │ 8 │
└──────────────────────┴─────────────┴───────────────┴─────────────┘
1 rows in set. Elapsed: 0.002 sec.
toInt(8|16|32|64)OrZero
函数说明:
toInt8OrZero(ex pr) — 结果为Int8数据类型,失败返回0。
toInt16OrZero(expr) — 结果为Int16数据类型,失败返回0。
toInt32OrZero(expr) — 结果为Int32数据类型,失败返回0。
toInt64OrZero(expr) — 结果为Int64数据类型,失败返回0。
- 参数:
expr
— 表达式返回一个字符类型。- 返回值:
整形在Int8
,Int16
,Int32
,或者Int64
的数据类型,如果转换失败直接返回0。
函数实例:
localhost :) select toInt64OrZero('123123'), toInt8OrZero('123qwe123')
SELECT
toInt64OrZero('123123'),
toInt8OrZero('123qwe123')
Query id: 26572397-e5d9-41e4-b46a-7a0bdf90b01e
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐
│ 123123 │ 0 │
└─────────────────────────┴───────────────────────────┘
1 rows in set. Elapsed: 0.009 sec.
toInt(8|16|32|64)OrNull
函数说明:
toInt8OrNull (expr) — 结果为Int8数据类型,失败返回Null。
toInt16OrNull (expr) — 结果为Int16数据类型,失败返回Null。
toInt32OrNull (expr) — 结果为Int32数据类型,失败返回Null。
toInt64OrNull (expr) — 结果为Int64数据类型,失败返回Null。
这个函数需要一个字符类型的入参,然后尝试把它转为
Int (8 | 16 | 32 | 64)
,如果转换失败直接返回NULL
。
函数实例:
localhost :) select toInt64OrNull('123123'), toInt8OrNull('123qwe123')
SELECT
toInt64OrNull('123123'),
toInt8OrNull('123qwe123')
Query id: de0dc0f3-2881-47d6-ba46-9bfad78d25e7
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐
│ 123123 │ ᴺᵁᴸᴸ │
└─────────────────────────┴───────────────────────────┘
1 rows in set. Elapsed: 0.026 sec.
toUInt(8|16|32|64) 转换一个输入值到UInt类型。
函数说明:
这个函数包括:
toUInt8(expr) — 结果为UInt8数据类型。
toUInt16(expr) — 结果为UInt16数据类型。
toUInt32(expr) — 结果为UInt32数据类型。
toUInt64(expr) — 结果为UInt64数据类型。
- 参数:
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。- 返回值:
1、整形在UInt8
,UInt16
,UInt32
,或者UInt64
的数据类型。 函数使用rounding towards zero
原则,这意味着会截断丢弃小数部分的数值。
2、 对于负数、NaN 和 Inf来说转换的结果是不确定的。如果你传入一个负数,比如:'-32'
,ClickHouse
会抛出异常。具体使用的时候,请参考数值类型转换常见的问题。
函数实例:
localhost :) SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8),toUInt64(inf),toUInt64(-inf)
SELECT
toUInt64(nan),
toUInt32(-32),
toUInt16('16'),
toUInt8(8.8),
toUInt64(inf),
toUInt64(-inf)
Query id: 254cb8a2-c6d9-4b14-b7ae-c9e1c9293ab7
┌─toUInt64(nan)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┬─toUInt64(inf)─┬──────toUInt64(-inf)─┐
│ 0 │ 4294967264 │ 16 │ 8 │ 0 │ 9223372036854775808 │
└───────────────┴───────────────┴────────────────┴──────────────┴───────────────┴─────────────────────┘
1 rows in set. Elapsed: 0.024 sec.
toUInt(8|16|32|64)OrZero
函数说明:
toUInt8OrZero(expr) — 结果为Int8数据类型,失败返回0。
toUInt16OrZero(expr) — 结果为Int16数据类型,失败返回0。
toUInt32OrZero(expr) — 结果为Int32数据类型,失败返回0。
toUInt64OrZero(expr) — 结果为Int64数据类型,失败返回0。
- 参数:
expr
— 表达式返回一个字符类型。- 返回值:
整形在Int8
,Int16
,Int32
,或者Int64
的数据类型,如果转换失败直接返回0。
函数实例:
localhost :) SELECT toUInt8OrZero('32'), toUInt8OrZero('16'), toUInt8OrZero('8wer8'),toUInt8OrZero('8.8')
SELECT
toUInt8OrZero('32'),
toUInt8OrZero('16'),
toUInt8OrZero('8wer8'),
toUInt8OrZero('8.8')
Query id: 415a109f-a6e3-422a-964e-44200b10b34d
┌─toUInt8OrZero('32')─┬─toUInt8OrZero('16')─┬─toUInt8OrZero('8wer8')─┬─toUInt8OrZero('8.8')─┐
│ 32 │ 16 │ 0 │ 0 │
└─────────────────────┴─────────────────────┴────────────────────────┴──────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
toUInt(8|16|32|64)OrNull
函数说明:
toUInt8OrNull(expr) — 结果为Int8数据类型,失败返回Null。
toUInt16OrNull(expr) — 结果为Int16数据类型,失败返回Null。
toUInt32OrNull(expr) — 结果为Int32数据类型,失败返回Null。
toUInt64OrNull(expr) — 结果为Int64数据类型,失败返回Null。
- 参数:
expr
— 表达式返回一个字符类型。- 返回值:
整形在Int8
,Int16
,Int32
,或者Int64
的数据类型,如果转换失败直接返回Null。
函数实例:
localhost :) SELECT toUInt8OrNull('32'), toUInt8OrNull('16'), toUInt8OrNull('8wer8'),toUInt8OrNull('8.8')
SELECT
toUInt8OrNull('32'),
toUInt8OrNull('16'),
toUInt8OrNull('8wer8'),
toUInt8OrNull('8.8')
Query id: 65ecee43-aa01-48ec-94ea-76406b347dff
┌─toUInt8OrNull('32')─┬─toUInt8OrNull('16')─┬─toUInt8OrNull('8wer8')─┬─toUInt8OrNull('8.8')─┐
│ 32 │ 16 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└─────────────────────┴─────────────────────┴────────────────────────┴──────────────────────┘
1 rows in set. Elapsed: 0.003 sec.
toFloat(32|64)
函数说明:
toFloat32(expr) — 结果为Float32数据类型。
toFloat64(expr) — 结果为Float64数据类型。
- 参数:
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。 返回值- 返回值:
1、在Float32
或者Float64
的数据类型。
2、函数使用rounding towards zero
原则,这意味着会截断丢弃小数部分的数值。
3、NaN
和Inf
转换是不确定的。具体使用的时候,请参考数值类型转换常见的问题。
4、字符串转换正常都会报错,但是在使用类似'2e3'
这种clickhoues
会将e3
识别为科学技术法1000
。
函数实例:
localhost :) select toFloat32(1),toFloat32('3.1111111111'),toFloat32('2e3'),toFloat32(nan),toFloat32(inf),toFloat32(-inf),toFloat32(3.11)
SELECT
toFloat32(1),
toFloat32('3.1111111111'),
toFloat32('2e3'),
toFloat32(nan),
toFloat32(inf),
toFloat32(-inf),
toFloat32(3.11)
Query id: e863f010-2299-4737-b60e-10551fe84461
┌─toFloat32(1)─┬─toFloat32('3.1111111111')─┬─toFloat32('2e3')─┬─toFloat32(nan)─┬─toFloat32(inf)─┬─toFloat32(-inf)─┬─toFloat32(3.11)─┐
│ 1 │ 3.1111112 │ 2000 │ nan │ inf │ -inf │ 3.11 │
└──────────────┴───────────────────────────┴──────────────────┴────────────────┴────────────────┴─────────────────┴─────────────────┘
1 rows in set. Elapsed: 0.003 sec.
toFloat(32|64)OrZero
函数说明:
toFloat32OrZero(expr) — 结果为Float32数据类型,失败返回0。
toFloat64OrZero(expr) — 结果为Float64数据类型,失败返回0。
- 参数:
expr
— 表达式返回一个字符类型。- 返回值:
在Float32
或者Float64
的数据类型,失败返回0。
函数实例:
localhost :) select toFloat32OrZero('qq'),toFloat32OrZero('3.00'),toFloat32OrZero('123.1233333')
SELECT
toFloat32OrZero('qq'),
toFloat32OrZero('3.00'),
toFloat32OrZero('123.1233333')
Query id: 6ffc2dfc-0b52-4e31-9f35-70c19059d911
┌─toFloat32OrZero('qq')─┬─toFloat32OrZero('3.00')─┬─toFloat32OrZero('123.1233333')─┐
│ 0 │ 3 │ 123.12334 │
└───────────────────────┴─────────────────────────┴────────────────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
toFloat(32|64)OrNull
函数说明:
toFloat32OrNull(expr) — 结果为Float32数据类型,失败返回Null。
toFloat64OrNull(expr) — 结果为Float64数据类型,失败返回Null。
- 参数:
expr
— 表达式返回一个字符类型。- 返回值:
在Float32
或者Float64
的数据类型,失败反馈null。
函数实例:
localhost :) select toFloat32OrNull('qq'),toFloat32OrNull('3.00'),toFloat32OrNull('123.1233333')
SELECT
toFloat32OrNull('qq'),
toFloat32OrNull('3.00'),
toFloat32OrNull('123.1233333')
Query id: f55c3833-4d89-4588-a6fd-ba3ceecbb739
┌─toFloat32OrNull('qq')─┬─toFloat32OrNull('3.00')─┬─toFloat32OrNull('123.1233333')─┐
│ ᴺᵁᴸᴸ │ 3 │ 123.12334 │
└───────────────────────┴─────────────────────────┴────────────────────────────────┘
1 rows in set. Elapsed: 0.003 sec.
toDate
函数说明:
toDate(exp) — 结果为Date数据类型。
- 参数:
1、exp
- 表达式返回一个数字、字符串、日期、时间戳。- 返回值:
1、Date
数据类型。
2、数字会在1970-01-1
的基础上加相应的数字天。
函数实例:
localhost :) select toDate(1),toDate('1970-01-02'),toDate(today()),toDate(now())
SELECT
toDate(1),
toDate('1970-01-02'),
toDate(today()),
toDate(now())
Query id: e20fff27-e981-42b3-a4e1-90d5d80c9936
┌──toDate(1)─┬─toDate('1970-01-02')─┬─toDate(today())─┬─toDate(now())─┐
│ 1970-01-02 │ 1970-01-02 │ 2021-05-21 │ 2021-05-21 │
└────────────┴──────────────────────┴─────────────────┴───────────────┘
1 rows in set. Elapsed: 0.003 sec.
toDateOrZero
函数说明:
toDateOrZero(exp) — 结果为Date数据类型,失败返回1970-01-01。
- 参数:
1、exp
- 表达式返回日期格式字符串、时间格式字符串、数字或者字符字符串。- 返回值:
1、Date
数据类型。失败返回1970-01-01
。
2、日期格式字符串、时间格式字符串,返回该时间日期。
3、数字或者字符字符串,会转换失败返回1970-01-01
。
函数实例:
localhost :) select toDateOrZero('2021-05-21 10:20:03'),toDateOrZero('2021-05-21'),toDateOrZero('21'),toDateOrZero('q@')
SELECT
toDateOrZero('2021-05-21 10:20:03'),
toDateOrZero('2021-05-21'),
toDateOrZero('21'),
toDateOrZero('q')
Query id: 8838a8f9-e741-46b9-8e33-62b46ed1d60c
┌─toDateOrZero('2021-05-21 10:20:03')─┬─toDateOrZero('2021-05-21')─┬─toDateOrZero('21')─┬─toDateOrZero('q@')─┐
│ 2021-05-21 │ 2021-05-21 │ 1970-01-01 │ 1970-01-01 │
└─────────────────────────────────────┴────────────────────────────┴────────────────────┴───────────────────┘
1 rows in set. Elapsed: 0.002 sec.
toDateOrNull
函数说明:
toDateOrNull(exp) — 结果为Date数据类型,失败返回Null。
- 参数:
1、exp
- 表达式返回日期格式字符串、时间格式字符串、数字或者字符字符串。- 返回值:
1、Date
数据类型。失败返回Null
。
2、日期格式字符串、时间格式字符串,返回该时间日期。
3、数字或者字符字符串,会转换失败返回Null
。
函数实例:
localhost :) select toDateOrNull('2021-05-21 10:20:03'),toDateOrNull('2021-05-21'),toDateOrNull('21'),toDateOrNull('q@')
SELECT
toDateOrNull('2021-05-21 10:20:03'),
toDateOrNull('2021-05-21'),
toDateOrNull('21'),
toDateOrNull('q@')
Query id: 2d993458-43d4-4125-b228-791d65c379aa
┌─toDateOrNull('2021-05-21 10:20:03')─┬─toDateOrNull('2021-05-21')─┬─toDateOrNull('21')─┬─toDateOrNull('q@')─┐
│ 2021-05-21 │ 2021-05-21 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└─────────────────────────────────────┴────────────────────────────┴────────────────────┴────────────────────┘
1 rows in set. Elapsed: 0.002 sec.
toDateTime
函数说明:
toDateTime(exp) — 结果为DateTime数据类型。
- 参数:
1、exp
- 表达式返回时间格式字符串、数字、Date
类型数据、DateTime
类型数据。- 返回值:
1、DateTime
数据类型。
2、时间格式字符串,返回该时间的DateTime
类型。
3、数字会直接在1970-01-01 08:00:00
的数字秒数。
函数实例:
localhost :) select toDateTime(today()),toDateTime(now()),toDateTime(1),toDateTime('2021-05-21 11:37:35')
SELECT
toDateTime(today()),
toDateTime(now()),
toDateTime(1),
toDateTime('2021-05-21 11:37:35')
Query id: 72da2705-d9ac-4d0c-987d-6ae7ff5308ef
┌─toDateTime(today())─┬───toDateTime(now())─┬────以上是关于Clickhouse 类型转换函数实战总结的主要内容,如果未能解决你的问题,请参考以下文章
《ClickHouse企业级应用:入门进阶与实战》5 ClickHouse函数
《ClickHouse企业级应用:入门进阶与实战》5 ClickHouse函数
《ClickHouse企业级应用:入门进阶与实战》4 ClickHouse高级数据类型
《ClickHouse企业级应用:入门进阶与实战》6 ClickHouse SQL基础