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