我想将数组分为一定值。在这里,说1
我尝试使用"变换",但无法进行,而"拆分"对字符串很有用。
Input : [1,8,2,1,4,5,6,1,1,4,2,4,1]
Expected Output : [[1,8,2],[1,4,5,6],[1],[1,4,2,4],[1]]
它不是很漂亮,但是您可以使用reduce
:
WITH t(a) AS (VALUES
array[1,8,2,1,4,5,6,1,1,4,2,4,1],
array[8,2,1,4,5,6,1,1,4,2,4,1]
)
SELECT
reduce(
a,
array[array[-1]],
(state, value) -> case
when value = 1 then
concat(state, array[value])
else
concat(slice(state, 1, cardinality(state) - 1), array[concat(slice(state, -1, 1)[1], array[value])])
end,
state -> slice(state, 2, cardinality(state) - 1)
)
FROM t
这个想法是将数组用作状态值,该数组将包含到目前为止得出的所有组。它是用一个包含任意值(array[array[-1]]
(的单个组初始化的,以在类型推理期间获得歧义。产生结果时丢弃该组(array[array[-1]]
(。
由于处理输入数组中的每个元素,如果是1
,则将新组添加到状态(concat(state, array[value])
(。否则,该值将添加到迄今为止得出的最后一个组(concat(slice(state, 1, cardinality(state) - 1), array[concat(slice(state, -1, 1)[1], array[value])])
(。