ClickHouse:哪里 0 为 Null?

Ale*_*hev 3 sql clickhouse

create database test

create table test.A (id UInt8, data String) engine MergeTree() order by (id)

create table test.B (id UInt8, data String) engine MergeTree() order by (id)

insert into test.A values (0,'a'),(1,'b'),(2,'c')

insert into test.B values (1,'x'),(2,'y'),(3,'z')
Run Code Online (Sandbox Code Playgroud)
select *, isNull(a.id), isNull(b.id) from test.A a full join test.B b on a.id = b.id

在此输入图像描述

如何判断0是0还是0是Null?

Gor*_*off 5

问题在于如何处理外连接。根据文档,这使用了一个设置join_use_nulls

\n
\n

设置 JOIN 行为的类型。合并表格时,可能会出现空单元格。ClickHouse 根据此设置以不同的方式填充它们。

\n

可能的值:

\n

0 \xe2\x80\x94 空单元格将填充相应字段类型的默认值。\n1 \xe2\x80\x94 JOIN 的行为方式与标准 SQL 中的行为方式相同。相应字段的类型转换为 Nullable,空单元格用 NULL 填充。

\n

默认值:0。

\n
\n

换句话说,默认方法是不符合 SQL 的。就我个人而言,我认为这种默认设置没有任何用处。NULL我猜想Clickhouse对价值观有强烈的厌恶。

\n

因此,您可以检查a.id = b.id是否存在匹配项。

\n

  • CH 使用 SSE/CPU 指令进行列计算和其他优化。但是 Null 不适合 Int64/Int16 的位空间……并且 CPU 不知道如何处理 Null,因此 Nullable 类型会使查询速度慢一倍。并且没有好的/简单的方法来修复它。 (2认同)