Clickhouse 使用 arrayJoin 展开数组字段时,有些数组字段可能是没有值的,这时候这些记录会被过滤掉,如下所示,

select *, arrayJoin(a) as b_item from (
  select array(1, 2, 3) as a, 1 as b
  union all
  select array(1) as a, 2 as b
  union all
  select array() as a, 3 as b
)

   ┌─a───────┬─b─┬─b_item─┐
1. │ [1,2,3] │ 112. │ [1,2,3] │ 123. │ [1,2,3] │ 13 │
   └─────────┴───┴────────┘
   ┌─a───┬─b─┬─b_item─┐
4. │ [1] │ 21 │
   └─────┴───┴────────┘

解决方法如下

select *, arrayJoin(if(empty(a), [null], a)) as b_item from (
  select array(1, 2, 3) as a, 1 as b
  union all
  select array(1) as a, 2 as b
  union all
  select array() as a, 3 as b
)

   ┌─a───┬─b─┬─b_item─┐
1. │ [1] │ 21 │
   └─────┴───┴────────┘
   ┌─a───────┬─b─┬─b_item─┐
2. │ [1,2,3] │ 113. │ [1,2,3] │ 124. │ [1,2,3] │ 13 │
   └─────────┴───┴────────┘
   ┌─a──┬─b─┬─b_item─┐
5. │ [] │ 3 │   ᴺᵁᴸᴸ │
   └────┴───┴────────┘
select *, arrayJoin(range(1, length(if(empty(a), [null], a)) + 1)) AS b_item_index from (
  select array(1, 2, 3) as a, 1 as b
  union all
  select array(1) as a, 2 as b
  union all
  select array() as a, 3 as b
)

   ┌─a───┬─b─┬─b_item_index─┐
1. │ [1] │ 21 │
   └─────┴───┴──────────────┘
   ┌─a──┬─b─┬─b_item_index─┐
2. │ [] │ 31 │
   └────┴───┴──────────────┘
   ┌─a───────┬─b─┬─b_item_index─┐
3. │ [1,2,3] │ 114. │ [1,2,3] │ 125. │ [1,2,3] │ 13 │
   └─────────┴───┴──────────────┘