ClickHouse数组列如何输出元素及其对应位置(+1)?
在ClickHouse中提取数组元素及其位置(位置从1开始)
当然可以搞定这个需求!在ClickHouse里实现起来很直观,核心就是用ARRAY JOIN配合arrayEnumerate函数,完美适配你要的位置从1开始的要求。
针对单个数组的示例
就拿你给出的['c','b','a']数组举例,直接用下面的查询就能得到想要的结果:
SELECT val AS key, idx AS position FROM (SELECT ['c', 'b', 'a'] AS arr) ARRAY JOIN arr AS val, arrayEnumerate(arr) AS idx
执行后输出会是:
| key | position |
|---|---|
| c | 1 |
| b | 2 |
| a | 3 |
针对表中数组列的场景
如果你的数组是表中的一列(比如表名为your_table,数组列名为array_column),只需要稍作修改:
SELECT elem AS key, pos AS position FROM your_table ARRAY JOIN array_column AS elem, arrayEnumerate(array_column) AS pos
简单解释下原理
arrayEnumerate(arr)会生成一个和原数组长度一致的新数组,每个元素对应原数组元素的位置(从1开始计数),正好满足你要的位置+1的需求。ARRAY JOIN用来把数组展开成多行,同时关联原数组元素和对应的位置数组元素,这样每一行就对应一个元素和它的位置。
哪怕数组里有重复元素也不用担心,arrayEnumerate会严格按照原数组的顺序生成位置,不会去重,完全符合你的预期。
内容的提问来源于stack exchange,提问作者redsquare




