我是靠谱客的博主 暴躁大门,最近开发中收集的这篇文章主要介绍【ClickHouse】空值问题1.建表时的空值问题2.查询时的空值问题3.关联问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

1.建表时的空值问题

2.查询时的空值问题

3.关联问题


       我们再ClickHouse环境下,SQL很多语法是和HIVE、Spark环境下不同的。以下从三个方面说明CK下空值的问题。

1.建表时的空值问题

如果我们建表时,不特殊说明空值,比如:

CREATE TABLE test.table1(
id String,
name String
) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192

这种情况下,如果将包含空值的数据,读入到表中时,会报错。

DB::Exception: Expression returns value NULL, that is out of range of type String, at: null) 

因此,为了防止这种情况的发生,我们一般会这样建表:

注意:这里的主键是不可以包含空值的,如果把主键也加Nullable会报错

CREATE TABLE test.table1(
id String,
name Nullable(String)
) ENGINE = MergeTree PARTITION BY id ORDER BY id SETTINGS index_granularity = 8192

2.查询时的空值问题

        上面说了建表的问题,接下来要实例一下,当我们表已经建好,且表数据已经有了,一列数据既包含null,又包含''这类空值,这个时候,如果不注意语法,会报错,如果包含这两类数据,不能使用coalesce,如下:

select coalesce(paymentterm, 0) as paymentterm_a,
       count(distinct orderid) as ornum
  from ckdb.test
 where d = '2020-05-08'
 group by paymentterm_a

报错如下:错误原因是paymentterm是string类型,不可以改成int类型

Code: 386, e.displayText() = DB::Exception: There is no supertype for types String, UInt8 because some of them are String/FixedString and some of them are not (version 19.17.6.36 (official build))

这里有一个小的知识点:

group by后面的名称,可以写select中的逻辑,也可以写as为的别名,下面使用case when改写上面的内容:

--方式一
select case when paymentterm is null or paymentterm = '' then 'null' else paymentterm end as paymentterm,
       count(distinct orderid) as ornum
  from ckdb.test
 where d = '2020-05-08'
 group by paymentterm

--方式二
select case when paymentterm is null or paymentterm = '' then 'null' else paymentterm end as paymentterm,
       count(distinct orderid) as ornum
  from ckdb.test
 where d = '2020-05-08'
 group by case when paymentterm is null or paymentterm = '' then 'null' else paymentterm end

--方式三
select coalesce(paymentterm,'null') as paymentterm,
       count(distinct orderid) as ornum
  from ckdb.test
 where d = '2020-05-08'
 group by coalesce(paymentterm,'null')

这两种方式都是可以达到效果的 

3.关联问题

如下场景,需要使用a表关联b表,把a和b都有的id剔除,在hive中我们一般这样实现:

select a.* 
  from a 
  left join b 
    on a.id = b.id 
 where b.id is null

不过这种方式,在CK中是有问题的,要借用coalesce来完成

select a.* 
  from a 
  left join b 
    on a.id = b.id 
 where coalesce(b.id,0) = 0

 

最后

以上就是暴躁大门为你收集整理的【ClickHouse】空值问题1.建表时的空值问题2.查询时的空值问题3.关联问题的全部内容,希望文章能够帮你解决【ClickHouse】空值问题1.建表时的空值问题2.查询时的空值问题3.关联问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部