- 类别:
半结构化和结构化数据函数 (数组/对象)
ARRAY_SLICE¶
返回从输入数组的指定元素子集构造的数组。
语法¶
ARRAY_SLICE( <array> , <from> , <to> )
实参¶
array
源数组,其中元素的子集用于构造结果数组。
from
源数组中的位置。第一个元素的位置是
0
。小于from
位置的元素不包含在生成的数组中。to
源数组中的位置。等于或大于
to
的位置的元素不包含在结果数组中。
返回¶
返回值的数据类型是 ARRAY
。
使用说明¶
输出包括元素 截取位置,但不包括 参数
to
指定的元素。如果数组为 NULL,则结果为 NULL。
如果
from
或to
之一为 NULL,则结果为 NULL。如果
from
或to
之一为负数,则相对于数组的末尾,而不是数组的开头。例如,“-2”是指数组中倒数第二个位置。如果
from
和to
都超出了数组的上端,或者都超出了数组的下端,则结果是空集。当您将 结构化 ARRAY 传递给该函数时,该函数会返回相同类型的结构化 ARRAY。
请注意,其中许多规则(例如,将负数解释为数组末尾的索引,以及包括切片截取位置,但不包括 to
索引的规则)类似于编程语言(如 Python)中的数组切片规则。
这些规则中的每一个都在下面的至少一个示例中进行了说明。
示例¶
这显示了对数组进行切片的简单示例:
select array_slice(array_construct(0,1,2,3,4,5,6), 0, 2);输出:
+---------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), 0, 2) | |---------------------------------------------------| | [ | | 0, | | 1 | | ] | +---------------------------------------------------+
此示例显示了使用 NULL 作为输入数组的效果:
select array_slice(NULL, 2, 3);输出:
+-------------------------+ | ARRAY_SLICE(NULL, 2, 3) | |-------------------------| | NULL | +-------------------------+
此示例显示了使用 NULL 作为切片索引之一的效果:
select array_slice(array_construct(0,1,2,3,4,5,6), NULL, 2);输出:
+------------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), NULL, 2) | |------------------------------------------------------| | NULL | +------------------------------------------------------+
此示例显示了使用负数作为索引的效果;该数字被解释为数组末尾的偏移量:
select array_slice(array_construct(0,1,2,3,4,5,6), 0, -2);输出:
+----------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), 0, -2) | |----------------------------------------------------| | [ | | 0, | | 1, | | 2, | | 3, | | 4 | | ] | +----------------------------------------------------+
两个索引都可以是负数,即两者都可以相对于数组的末尾:
select array_slice(array_construct(0,1,2,3,4,5,6), -5, -3);输出:
+-----------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), -5, -3) | |-----------------------------------------------------| | [ | | 2, | | 3 | | ] | +-----------------------------------------------------+
在此示例中,两个索引都超出了数组的末尾:
select array_slice(array_construct(0,1,2,3,4,5,6), 10, 12);输出:
+-----------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), 10, 12) | |-----------------------------------------------------| | [] | +-----------------------------------------------------+
在此示例中,两个索引都位于数组的开头之前:
select array_slice(array_construct(0,1,2,3,4,5,6), -10, -12);输出:
+-------------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), -10, -12) | |-------------------------------------------------------| | [] | +-------------------------------------------------------+
尽管索引必须是数字,但数组的元素不需要是数字:
SELECT ARRAY_SLICE(ARRAY_CONSTRUCT('foo','snow','flake','bar'), 1, 3);输出:
+----------------------------------------------------------------+ | ARRAY_SLICE(ARRAY_CONSTRUCT('FOO','SNOW','FLAKE','BAR'), 1, 3) | |----------------------------------------------------------------| | [ | | "snow", | | "flake" | | ] | +----------------------------------------------------------------+