Clickhouse 类型转换函数实战总结

Posted 扫地增

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clickhouse 类型转换函数实战总结相关的知识,希望对你有一定的参考价值。

文章目录

数据精度丢失问题

当把一个值从一个类型转换为另外一个类型的时候,你需要注意的是这是一个不安全的操作,可能导致数据精度的丢失。数据精度丢失一般发生在你将一个大的数据类型转换为小的数据类型的时候,或者你把两个不同的数据类型相互转换的时候。
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、NaNInf转换是不确定的。具体使用的时候,请参考数值类型转换常见的问题。

函数实例:

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)─┐
│ -922337203685477580832168 │
└──────────────────────┴─────────────┴───────────────┴─────────────┘

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')─┐
│                  1231230 │
└─────────────────────────┴───────────────────────────┘

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)─┐
│             0429496726416809223372036854775808 │
└───────────────┴───────────────┴────────────────┴──────────────┴───────────────┴─────────────────────┘

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')─┐
│                  321600 │
└─────────────────────┴─────────────────────┴────────────────────────┴──────────────────────┘

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')─┐
│                  3216 │                   ᴺᵁᴸᴸ │                 ᴺᵁᴸᴸ │
└─────────────────────┴─────────────────────┴────────────────────────┴──────────────────────┘

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、NaNInf转换是不确定的。具体使用的时候,请参考数值类型转换常见的问题。
    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)─┐
│            13.11111122000 │            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')─┐
│                     03123.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')─┐
│                  ᴺᵁᴸᴸ │                       3123.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-021970-01-022021-05-212021-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-212021-05-211970-01-011970-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-212021-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基础

《ClickHouse企业级应用:入门进阶与实战》6 ClickHouse SQL基础

《ClickHouse企业级应用:入门进阶与实战》8 基于ClickHouse Bitmap实现DMP用户画像标签圈人