类别:

:doc:`/sql-reference/functions-semistructured`(数组/对象的创建和操作)

ARRAYS_ZIP

返回 对象 的一个 数组,每个对象都包含输入数组中第 n 个元素的键值对。例如,在返回的数组中,第一个对象包含输入数组中每个第一个元素的键值对,第二个对象包含输入数组中每个第二个元素的键值对,依此类推。

语法

ARRAYS_ZIP( <array> [ , <array> ... ] )
Copy

实参

array

输入数组。

输入数组的长度可以不同。

如果任何输入数组为 结构化数组,则所有输入数组都必须是结构化数组。

返回

返回以下类型之一的值:

  • 如果输入数组是半结构化数组,则该函数返回由结构化对象组成的半结构化数组。

  • 如果输入数组是结构化数组,则该函数返回由结构化对象组成的结构化数组。结构化对象的定义取决于输入数组的数量和数组中值的类型。

  • 如果任何输入数组为 NULL,则该函数返回 NULL。

每个对象都包含输入数组中第 n 个元素值的键值对。键($1$2 等)代表输入数组的位置。

例如,假设你传入了以下数组:

SELECT ARRAYS_ZIP(
  [1, 2, 3],
  ['first', 'second', 'third'],
  ['i', 'ii', 'iii']
) AS zipped_arrays;
Copy

该函数返回以下对象数组:

+---------------------+
| ZIPPED_ARRAYS       |
|---------------------|
| [                   |
|   {                 |
|     "$1": 1,        |
|     "$2": "first",  |
|     "$3": "i"       |
|   },                |
|   {                 |
|     "$1": 2,        |
|     "$2": "second", |
|     "$3": "ii"      |
|   },                |
|   {                 |
|     "$1": 3,        |
|     "$2": "third",  |
|     "$3": "iii"     |
|   }                 |
| ]                   |
+---------------------+

在返回的数组中:

  • 第一个对象包含所有输入数组的第一个元素。

  • 第二个对象包含所有输入数组的第二个元素。

  • 第三个对象包含所有输入数组的第三个元素。

对象中的键标识输入数组:

  • $1 键值对包含来自第一个输入数组的值。

  • $2 键值对包含来自第二个输入数组的值。

  • $3 键值对包含来自第三个输入数组的值。

使用说明

  • 返回的数组与最长的输入数组一样长。如果某些输入数组较短,则该函数使用 JSON 空值 来表示较短数组中缺少的其余元素。

  • 如果输入数组包含一个 NULL 元素,则该函数为该元素返回一个 JSON 空值。

示例

以下示例演示了该函数的工作原理:

一个输入数组

以下示例返回一个对象数组,该数组包含单个数组中的第一、第二和第三个元素:

SELECT ARRAYS_ZIP(
  [1, 2, 3]
) AS zipped_array;
Copy
+--------------+
| ZIPPED_ARRAY |
|--------------|
| [            |
|   {          |
|     "$1": 1  |
|   },         |
|   {          |
|     "$1": 2  |
|   },         |
|   {          |
|     "$1": 3  |
|   }          |
| ]            |
+--------------+

多个输入数组

以下示例返回一个对象数组,该数组包含输入数组中的第一、第二和第三个元素:

SELECT ARRAYS_ZIP(
  [1, 2, 3],
  [10, 20, 30],
  [100, 200, 300]
) AS zipped_array;
Copy
+---------------+
| ZIPPED_ARRAY  |
|---------------|
| [             |
|   {           |
|     "$1": 1,  |
|     "$2": 10, |
|     "$3": 100 |
|   },          |
|   {           |
|     "$1": 2,  |
|     "$2": 20, |
|     "$3": 200 |
|   },          |
|   {           |
|     "$1": 3,  |
|     "$2": 30, |
|     "$3": 300 |
|   }           |
| ]             |
+---------------+

不同长度的输入数组

以下示例传入了不同长度的输入数组。对于较短数组中不存在的值,该函数在对象中使用 JSON 空值。

SELECT ARRAYS_ZIP(
  [1, 2, 3],
  ['one'],
  ['I', 'II']
) AS zipped_array;
Copy
+------------------+
| ZIPPED_ARRAY     |
|------------------|
| [                |
|   {              |
|     "$1": 1,     |
|     "$2": "one", |
|     "$3": "I"    |
|   },             |
|   {              |
|     "$1": 2,     |
|     "$2": null,  |
|     "$3": "II"   |
|   },             |
|   {              |
|     "$1": 3,     |
|     "$2": null,  |
|     "$3": null   |
|   }              |
| ]                |
+------------------+

NULL 和空数组处理

如下例所示,为任何输入数组传入一个 NULL 都将导致该函数返回一个 SQL NULL:

SELECT ARRAYS_ZIP(
  [1, 2, 3],
  NULL,
  [100, 200, 300]
) AS zipped_array;
Copy
+--------------+
| ZIPPED_ARRAY |
|--------------|
| NULL         |
+--------------+

在以下示例中,所有输入数组均为空,这导致该函数返回一个空对象:

SELECT ARRAYS_ZIP(
  [], [], []
) AS zipped_array;
Copy
+--------------+
| ZIPPED_ARRAY |
|--------------|
| [            |
|   {}         |
| ]            |
+--------------+

在以下示例中,输入数组中的一些元素为 NULL。在返回的对象中,这些元素的值为 JSON null:

SELECT ARRAYS_ZIP(
  [1, NULL, 3],
  [NULL, 20, NULL],
  [100, NULL, 300]
) AS zipped_array;
Copy
+-----------------+
| ZIPPED_ARRAY    |
|-----------------|
| [               |
|   {             |
|     "$1": 1,    |
|     "$2": null, |
|     "$3": 100   |
|   },            |
|   {             |
|     "$1": null, |
|     "$2": 20,   |
|     "$3": null  |
|   },            |
|   {             |
|     "$1": 3,    |
|     "$2": null, |
|     "$3": 300   |
|   }             |
| ]               |
+-----------------+
语言: 中文