ClickHouse 其它的一些操作函数 (十五)
ClickHouse 其它的一些操作函数 (十五)
本文来源: ( https://www.cnblogs.com/traditional/tag/ClickHouse:一款速度快到让人发指的列式存储数据库/ )
楔子
在 ClickHouse 中还存在一些其它比较有意思的函数,我们来看一下。
and:计算多个值逻辑与连接的结果
该函数只能接收 整型、浮点型和 Null,其逻辑和 Python 中的 and 类似
1 | SELECT and(1, 2, 0, Null, 3, 5); |
or:计算多个值逻辑或连接的结果
1 | SELECT or(1, 2, 0, Null, 3, 5); |
not:同样只能接收整型、浮点型、Null,用于逻辑取反
举个栗子:如果是非 0、非 Null,那么逻辑上就为真,因此调用 not 之后会得到假,也就是 0。
1 | -- not(0) 得到 1,not(Null) 还是 Null,not(非0、非 Null) 得到 0 |
if:想象成编程语言中的三元表达式即可
1 | SELECT number, if(number < 5, 'less than 5', 'greater than or equal to 5') |
同样的,我们可以使用 CASE WHEN 语句实现。
1 | SELECT number, CASE WHEN number < 5 THEN 'less than 5' ELSE 'greater than or equal to 5' END |
我们看到底层转化成了 multiIf,那么这个 multiIf 是做什么的呢?首先 if 函数的参数如下:
1 | if(cond, then, else) |
而 multiIf 函数的参数如下:
1 | multiIf(cond1, then1, cond2, then2, cond3, then3, ..., else) |
所以从名字上也能看出来 multiIf 是干什么的,if 只能有一个条件,相当于编程语言中的 if … else;而 multiIf 可以接收多个条件,相当于编程语言中的 if … else if … else if … else。
1 | -- 等价于 multiIf(number < 5, 'less than 5', number = 5, 'equal to 5', 'greater than 5') |
根据返回的结果集的字段我们发现底层会变成函数调用:
a < b 等价于 less(a, b)
a = b 等价于 equals(a, b)
a > b 等价于 greater(a, b)
a <= b 等价于 lessOrEquals(a, b)
a >= b 等价于 greaterOrEquals(a, b)
a != b 等价于 notEquals(a, b)
但还是正如我们之前所说的,可以直接使用 CASE WHEN 进行实现,因为它也是关系型数据中非常常用的语法,这样读起来会更加的亲切。关于大小比较,我们也是直接使用操作符即可,没必要使用 less、equals、greater 等函数。
数学计算函数
以下是关于数学计算的一些函数,来看一下。
e:一个函数,调用之后返回底数 e
1 | SELECT e(); |
pi:一个函数,调用之后返回圆周率 π
1 | SELECT pi(); |
exp:返回 e 的 x 次方
1 | SELECT exp(1), exp(2); |
除了 exp 之外,还有 exp2 返回 2 的 x 次方,exp10 返回 10 的 x 次方。
1 | SELECT exp2(2), exp10(2); |
log、ln:两者是等价的,都是以自然对数为底
1 | SELECT log(e()), ln(e() * e()); |
同理还有 log2 以 2 为底,log10 以 10 为底。
1 | SELECT log2(8), log10(1000); |
sqrt:返回一个数的平方根
1 | SELECT sqrt(9); |
cbrt:返回一个数的立方根
1 | SELECT cbrt(27); |
pow:计算 x 的 y 次方
1 | -- pow 也可以写成 power |
sin、cos、tan:计算正弦值、余弦值、正切值
asin、acos、atan:计算反正弦值、反余弦值、反正切值
sinh、cosh、tanh:计算双曲正弦值、双曲余弦值、双曲正切值
asinh、acosh、atanh:计算反双曲正弦值、反双曲余弦值、反双曲正切值
atan2:atan 的增强版,具体细节可以百度或者谷歌
hypot:给定两个直角边,计算斜边长度,等于 x2+y2−−−−−−√�2+�2
1 | SELECT hypot(3, 4), hypot(6, 8); |
sign:小于 0 返回 -1、等于 0 返回 0、大于 0 返回 1
1 | SELECT sign(-100), sign(0), sign(111); |
floor、ceil(或者 ceiling):返回小于等于 x 的最大整数、大于等于 x 的最小整数,注意:说返回整数其实不太准确,因为返回的仍是 Float64
1 | SELECT floor(3.14), ceil(3.14); |
truncate、trunc:截断小数点
1 | SELECT trunc(3.14), trunc(-2.17); |
round:保留指定位数的小数
1 | -- 不指定位数,将一位都不保留 |
注意:ClickHouse 中的 round 还有一种特殊用法,那就是对整数四舍五入。
1 | -- 当指定为负数时,表示对整数或者小数点前面的进行四舍五入 |
roundToExp2:将数值转为某个最接近的 2 的整数次幂,比如 roundToExp2(33) 得到的就是 32,因为 32 是 2 的 5 次幂;roundToExp2(31) 得到的就是 16,因为 16 是 2 的 4 次幂
1 | -- 小于 1,返回 0 |
roundAge:如果一个数值小于 18,返回其本身;否则将其转成 18、25、35、45、55 当中与之最接近的一个值,很明显这个函数是针对 Yandex 公司的业务而专门设计的
1 | SELECT roundAge(15), roundAge(20), roundAge(29), roundAge(38), roundAge(1000); |
roundDown:将一个数值四舍五入到某个数组中与之最接近的值,如果数值小于数组中的最小值,那么等于最小值
1 | WITH [18, 25, 35, 45, 55] AS arr |
rand、rand32:生成一个 UInt32 伪随机数
rand64:生成一个 UInt64 伪随机数
1 | SELECT rand32(), rand64(); |
randConstant:生成一个 UInt32 伪随机数,但在一次查询中多次调用得到的结果一样
1 | SELECT rand32(), randConstant() FROM numbers(3); |
常见编码函数
以下是一些常见的编码函数,一起来看一下。
char:将 ASCII 码转成对应的字符,可以同时接收多个 ASCII 码
1 | SELECT char(97), char(97, 98, 99); |
hex:将整型用 16 进制表示
1 | SELECT hex(97), hex(98), hex(99); |
hex 除了接收整型之外,还可以接收字符串,将每个字符对应的 ASCII 码用 16 进制表示。
1 | -- 十六进制:a -> 61, b -> 62, c->63 |
unhex:hex 的逆运算,但只能接收字符串
1 | SELECT unhex('616263'); |
其它函数
hostName:返回当前 ClickHouse Server 所在节点的主机名
1 | SELECT hostName(); |
getMacro:从服务器的宏配置中获取指定的值
1 | <macros> |
然后即可通过 getMacro(name) 获取,当然也可以查看所有的宏。
1 | SELECT * FROM system.macros; |
fqdn:返回全限定域名,和我当前的主机名是一样的
1 | SELECT fqdn(); |
basename:返回路径中最后一个 / 或者 \ 后面的部分
1 | SELECT '/root/girls/1.csv' file_path, basename(file_path) file_name; |
visibleWidth:当以文本格式向控制台输出内容时,计算出所需要的宽度,用于美化输出
1 | SELECT visibleWidth(3.1415), visibleWidth('satori'), visibleWidth(Null); |
可以看到就是把内容当成纯文本,计算所占的长度。
toTypeName:返回一个值的类型
1 | SELECT toTypeName([1, 2, 3]), toTypeName(123), toTypeName((11, '22')); |
ignore:接收任何参数,包括 Null,但总是返回 0;然而该参数仍然会被考虑在内,因此一般用于基准测试
1 | SELECT ignore(11), ignore([1, 2, 3]), ignore(Null); |
currentDatabase:获取当前所在的数据库
1 | SELECT currentDatabase(); |
currentUsere:获取当前的用户
1 | -- 当前的默认用户也叫 default |
总结
以上就是 ClickHouse 的一些其它函数,当然还是那句话,ClickHouse 的提供的函数非常多,不止我们上面说的,只不过有很多个人觉得用不上,所以就不说了。当然如果你有兴趣的话可以去官网进行查看,链接: https://clickhouse.tech/docs/en/sql-reference/functions/ 。