ClickHouse可用参数join_use_nulls设置JOIN行为的类型。在合并表时,可能会出现空值,即左表或右表有NULL值。ClickHouse根据此设置以不同的方式填充它们。可取值包括:

  • 0:默认值,空值用相应字段类型的默认值填充。
  • 1:JOIN的行为与标准SQL相同。相应字段的类型被转换为Nullable,并且空值用NULL填充。

下面举例说明两者的区别:

SELECT
  a.id,a.log_date,a.name,b.age
FROM
  (
    SELECT 1 AS id,'2023-07-20' AS log_date,'test1' AS name
    UNION ALL
    SELECT 2 AS id,'2023-07-21' AS log_date,'test1' AS name
    UNION ALL
    SELECT 3 AS id,'2023-07-22' AS log_date,'test1' AS name
  ) a
  LEFT JOIN
  (
    SELECT 1 AS id,'2023-07-20' AS log_date,30 AS age
    UNION ALL
    SELECT 3 AS id,'2023-07-20' AS log_date,25 AS age
  ) b ON a.id=b.id
;
-- join_use_nulls为0时,id为2的行age列为0(整数的默认值)
-- join_use_nulls为1时,id为2的行age为NULL

对以上结果需要注意聚合、判断的使用,比如参数设为0时,聚合使用可能会有区别,使用COUNT(age)会计数空值。再比如参数设为1后,使用WHERE CAST(b.log_date AS String)<>''会报错,因为在id为2的行b.log_date为NULL,可使用CAST(b.log_date AS Nullable(String))判断。

为了遵循和标准SQL一致建议设为1。

更多推荐