You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决ClickHouse中ARRAY JOIN不同大小数组的匹配错误?

问题描述

我通过以下查询得到一张数据表:

SELECT o.id AS order_id,
       arrayMap(i -> i, range(1, o.quantity)) AS virtual_sku,
       s.sku AS sku
  FROM orders o
  LEFT JOIN (SELECT order_id,
                    groupArray(sku) AS sku
               FROM storage
              GROUP BY 
                    order_id) s
    ON o.id = s.order_id

查询结果如下:

order_idvirtual_skusku
41273[1,2,3][12478431567,12478431568]

示例中订单41273的quantity为3,对应存储中收到2个带唯一sku的商品。我希望将其转换为如下数据表:

orderv_sku_sku
41273112478431567
41273212478431568
412733

我尝试执行以下语句:

SELECT o.id AS order_id,
       virtual_sku,
       sku
 ARRAY JOIN
       virtual_sku AS v_sku,
       sku as _sku

但出现了"Sizes of ARRAY-JOIN-ed arrays do not match"错误,请问如何避免该错误?


解决方法

这个错误的核心原因是ARRAY JOIN要求关联的所有数组长度必须完全一致,但你的virtual_sku长度为3,sku数组长度为2,两者不匹配导致报错。解决思路是先把sku数组补全到和virtual_sku相同的长度,空缺位置用空值填充,再执行ARRAY JOIN。

可以使用arrayResize函数调整数组长度,以下是修改后的查询语句:

SELECT 
    o.id AS `order`,
    v_sku,
    _sku
FROM orders o
LEFT JOIN (
    SELECT order_id, groupArray(sku) AS sku
    FROM storage
    GROUP BY order_id
) s ON o.id = s.order_id
ARRAY JOIN 
    arrayMap(i -> i, range(1, o.quantity)) AS v_sku,
    arrayResize(sku, o.quantity, '') AS _sku

关键说明:

  • arrayResize(sku, o.quantity, '')会将sku数组的长度强制调整为o.quantity的值(此处为3),空缺位置用空字符串填充,确保两个数组长度一致,满足ARRAY JOIN的要求。
  • 如果需要用NULL而非空字符串填充空缺,只需把第三个参数改为NULL即可。

另外也可以用arrayPad函数实现相同效果,比如arrayPad(sku, o.quantity, ''),它会在数组末尾补全指定值直到达到目标长度,和arrayResize在此场景下的作用一致。

内容的提问来源于stack exchange,提问作者Zaoza14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:56:32