类别:

:doc:`/sql-reference/functions-semistructured`(数组/对象)

ARRAY_SORT

返回一个 ARRAY,包含按升序或降序排序的输入 ARRAY 的元素。您可以指定 NULL 元素是在非 NULL 元素之前还是之后排序。

语法

ARRAY_SORT( <array> [ , <sort_ascending> [ , <nulls_first> ] ] )
Copy

实参

必填

array

要排序的元素 ARRAY。

可选

sort_ascending

指定是按升序还是降序对元素进行排序:

  • 指定 TRUE 以升序对元素进行排序。

  • 指定 FALSE 以降序对元素进行排序。

默认:TRUE

nulls_first

指定是将 SQL NULL 元素放在排序 ARRAY 的开头还是结尾:

  • 指定 TRUE 将 SQL NULL 元素放在 ARRAY 的第一位。

  • 指定 FALSE 将 SQL NULL 元素放在 ARRAY 的最后。

默认值:如果 ARRAY 按升序排序,则为 FALSE;如果 ARRAY 按降序排序,则为 TRUE。

此实参仅影响 SQL NULL 元素的顺序。这不会影响 JSON null 元素的顺序。

返回

此函数返回一个 ARRAY,其中包含按排序顺序排列的 array 元素。

使用说明

  • 排序顺序等效于 展平 ARRAY 并使用相应的 ASC | DESC and NULLS FIRST | LAST 参数指定 ORDER BY 子句所得到的顺序。

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

  • 当 ARRAY 包含以下任一项时,此函数不能保证提供稳定的排序:

    • 两种不同 数字时间戳 类型的元素。

    • 包含两种不同数字或时间戳类型的对象。

示例

以下示例返回一个数字 ARRAY,其中输入 ARRAY 常数 中的元素按升序排序。这些元素包括一个 JSON NULL (PARSE_JSON('null')) 和一个 SQL NULL。

请注意,在排序 ARRAY 中,JSON NULLs (null) 和 SQL NULLs (undefined) 是最后的元素。

SELECT ARRAY_SORT([20, PARSE_JSON('null'), 0, NULL, 10]);
Copy
+---------------------------------------------------+
| ARRAY_SORT([20, PARSE_JSON('NULL'), 0, NULL, 10]) |
|---------------------------------------------------|
| [                                                 |
|   0,                                              |
|   10,                                             |
|   20,                                             |
|   null,                                           |
|   undefined                                       |
| ]                                                 |
+---------------------------------------------------+

以下示例返回一个数字 ARRAY,其中的元素按降序排序。请注意,在排序 ARRAY 中,JSON NULLs (null) 和 SQL NULLs (undefined) 是前面的元素。

SELECT ARRAY_SORT([20, PARSE_JSON('null'), 0, NULL, 10], FALSE);
Copy
+----------------------------------------------------------+
| ARRAY_SORT([20, PARSE_JSON('NULL'), 0, NULL, 10], FALSE) |
|----------------------------------------------------------|
| [                                                        |
|   undefined,                                             |
|   null,                                                  |
|   20,                                                    |
|   10,                                                    |
|   0                                                      |
| ]                                                        |
+----------------------------------------------------------+

以下示例按升序对元素进行排序。该示例将 nulls_first 实参设置为 TRUE,以将 SQL NULLs (undefined) 放在排序 ARRAY 的第一位。(默认情况下,SQL NULLs 放在按升序排序的 ARRAY 的末尾。)

请注意,nulls_first 对 JSON NULLs (null) 的放置没有影响。

SELECT ARRAY_SORT([20, PARSE_JSON('null'), 0, NULL, 10], TRUE, TRUE);
Copy
+---------------------------------------------------------------+
| ARRAY_SORT([20, PARSE_JSON('NULL'), 0, NULL, 10], TRUE, TRUE) |
|---------------------------------------------------------------|
| [                                                             |
|   undefined,                                                  |
|   0,                                                          |
|   10,                                                         |
|   20,                                                         |
|   null                                                        |
| ]                                                             |
+---------------------------------------------------------------+

以下示例按降序对元素进行排序。该示例将 nulls_first 实参设置为 FALSE,以将 SQL NULLs (undefined) 放在排序 ARRAY 的最后。(默认情况下,SQL NULLs 放在按降序排序的 ARRAY 的开头。)

请注意,nulls_first 对 JSON NULLs (null) 的放置没有影响。

SELECT ARRAY_SORT([20, PARSE_JSON('null'), 0, NULL, 10], FALSE, FALSE);
Copy
+-----------------------------------------------------------------+
| ARRAY_SORT([20, PARSE_JSON('NULL'), 0, NULL, 10], FALSE, FALSE) |
|-----------------------------------------------------------------|
| [                                                               |
|   null,                                                         |
|   20,                                                           |
|   10,                                                           |
|   0,                                                            |
|   undefined                                                     |
| ]                                                               |
+-----------------------------------------------------------------+

以下示例使用 ARRAY_INSERT 函数构造一个稀疏填充的 ARRAY。(该示例在 ARRAY 中的特定位置插入值 12。)该示例随后使用 ARRAY_SORT 函数对此 ARRAY 进行排序。

SELECT ARRAY_INSERT(ARRAY_INSERT(ARRAY_CONSTRUCT(), 3, 2), 6, 1) arr, ARRAY_SORT(arr);
Copy
+--------------+-----------------+
| ARR          | ARRAY_SORT(ARR) |
|--------------+-----------------|
| [            | [               |
|   undefined, |   1,            |
|   undefined, |   2,            |
|   undefined, |   undefined,    |
|   2,         |   undefined,    |
|   undefined, |   undefined,    |
|   undefined, |   undefined,    |
|   1          |   undefined     |
| ]            | ]               |
+--------------+-----------------+

以下示例演示了对不同数值类型的 ARRAY 进行排序会导致不稳定的排序。该示例使用包含 NUMBER 值和 REAL 值的 ARRAY。

SELECT ARRAY_SORT([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1e0::REAL]) AS array_of_different_numeric_types;
Copy
+----------------------------------+
| ARRAY_OF_DIFFERENT_NUMERIC_TYPES |
|----------------------------------|
| [                                |
|   1,                             |
|   1.000000000000000e+00,         |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1,                             |
|   1                              |
| ]                                |
+----------------------------------+
语言: 中文