如何解决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_id | virtual_sku | sku |
|---|---|---|
| 41273 | [1,2,3] | [12478431567,12478431568] |
示例中订单41273的quantity为3,对应存储中收到2个带唯一sku的商品。我希望将其转换为如下数据表:
| order | v_sku | _sku |
|---|---|---|
| 41273 | 1 | 12478431567 |
| 41273 | 2 | 12478431568 |
| 41273 | 3 |
我尝试执行以下语句:
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
相关产品推荐
相关产品推荐

