类别:

半结构化和结构化数据函数 (数组/对象)

ARRAY_SLICE

返回从输入数组的指定元素子集构造的数组。

语法

ARRAY_SLICE( <array> , <from> , <to> )
Copy

实参

array

源数组,其中元素的子集用于构造结果数组。

from

源数组中的位置。第一个元素的位置是 0。小于 from 的位置的元素不包含在生成的数组中。

to

源数组中的位置。等于或大于 to 的位置的元素不包含在结果数组中。

返回

此函数返回 ARRAY 类型的值。

如果任何实参为 NULL,包括输入 arrayfromto,则返回 NULL。

使用说明

  • 输出包括元素 截取位置,但不包括 参数 to 指定的元素。

  • 如果 fromto 之一为负数,则相对于数组的末尾,而不是数组的开头。例如,-2 是指数组中倒数第二个位置。

  • 如果 fromto 都超出了数组的上端,或者都超出了数组的下端,则结果是空集。

  • 当您将 结构化数组 传递给该函数时,该函数会返回相同类型的结构化数组。

请注意,其中许多规则(例如,将负数解释为数组末尾的索引,以及包括切片截取位置,但不包括 to 索引的规则)类似于编程语言(如 Python)中的数组切片规则。

这些规则中的每一个都在下面的至少一个示例中进行了说明。

示例

这些示例使用 ARRAY 常量 构造数组。或者,您可以使用 ARRAY_CONSTRUCT 函数构造数组。

此示例展示了一个简单的数组切片:

SELECT ARRAY_SLICE([0,1,2,3,4,5,6], 0, 2);
Copy
+------------------------------------+
| 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;
Copy
+---------------------+
| SLICE_TO_LAST_INDEX |
|---------------------|
| [                   |
|   3,                |
|   4,                |
|   5,                |
|   6                 |
| ]                   |
+---------------------+

尽管索引必须是数字,但数组的元素不需要是数字:

SELECT ARRAY_SLICE(['foo','snow','flake','bar'], 1, 3);
Copy
+-------------------------------------------------+
| ARRAY_SLICE(['FOO','SNOW','FLAKE','BAR'], 1, 3) |
|-------------------------------------------------|
| [                                               |
|   "snow",                                       |
|   "flake"                                       |
| ]                                               |
+-------------------------------------------------+

此示例显示了使用 NULL 作为输入数组的效果:

SELECT ARRAY_SLICE(NULL, 2, 3);
Copy
+-------------------------+
| ARRAY_SLICE(NULL, 2, 3) |
|-------------------------|
| NULL                    |
+-------------------------+

此示例显示了使用 NULL 作为切片索引之一的效果:

SELECT ARRAY_SLICE([0,1,2,3,4,5,6], NULL, 2);
Copy
+---------------------------------------+
| ARRAY_SLICE([0,1,2,3,4,5,6], NULL, 2) |
|---------------------------------------|
| NULL                                  |
+---------------------------------------+

此示例显示了使用负数作为索引的效果。该数字被解释为数组末尾的偏移量:

SELECT ARRAY_SLICE([0,1,2,3,4,5,6], 0, -2);
Copy
+-------------------------------------+
| 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);
Copy
+--------------------------------------+
| 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);
Copy
+--------------------------------------+
| ARRAY_SLICE([0,1,2,3,4,5,6], 10, 12) |
|--------------------------------------|
| []                                   |
+--------------------------------------+

在此示例中,两个索引都位于数组的开头之前:

SELECT ARRAY_SLICE([0,1,2,3,4,5,6], -10, -12);
Copy
+----------------------------------------+
| ARRAY_SLICE([0,1,2,3,4,5,6], -10, -12) |
|----------------------------------------|
| []                                     |
+----------------------------------------+
语言: 中文