将ARRAY数组a中的元素根据comparator进行排序。

命令格式

array<T> array_sort(array<T> <a>, function<T, T, bigint> <comparator>)

参数说明

  • a:必填。ARRAY数组。array<T>中的T指代ARRAY数组元素的数据类型,数组中的元素可以为任意类型。

  • comparator:必填。用于比较ARRAY数组中2个元素大小的函数(内建函数或自定义函数)或表达式。

    comparator(a, b)的处理逻辑为:当a等于b时,返回0。当a小于b时,返回负整数。当a大于b时,返回正整数。如果comparator(a, b)返回NULL,则返回报错。

    重要

    ARRAY_SORT中的比较函数要求是自洽的,即:

    • compare(a, b) > 0,则要求compare(b, a) < 0

    • compare(a, b) = 0,则要求compare(b, a) = 0

    • compare(a, b) < 0,则要求compare(b, a) > 0

    不自洽函数示例如下:

    • (left, right) -> CASE WHEN left <= right THEN -1L ELSE 0L END

      假如设置a = 1, b = 1,则compare(a, b) = -1compare(b, a) = -1,两个比较结果相互矛盾即函数不自洽。

    • (left, right) -> CASE WHEN left < right THEN -1L WHEN left = right THEN 0L ELSE 1L END

      假如设置a = NULL, b = 1,则compare(a, b) = 1compare(b, a) = 1,两个比较结果相互矛盾即函数不自洽。

返回值说明

返回ARRAY类型。

使用示例

  • 示例1:对数组array(5,6,1)进行排序。

    SELECT array_sort(array(5,6,1),(left,right)->
                      CASE 
                       WHEN left<right THEN-1L 
                       WHEN left>right THEN 1L 
                       ELSE 0L 
                      END
                     );

    返回结果如下:

    +------------+
    | _c0        |
    +------------+
    | [1,5,6]    |
    +------------+
  • 示例2:

    select array_sort(a, (a,b)->
                      case 
                       when a.a>b.a then 1L 
                       when a.a=b.a then 0L 
                       else -1L 
                      end)
    from values (
      array(named_struct('a', 1, 'b', 10),
            named_struct('a', 3, 'b', 11),
            named_struct('a', 2, 'b', 12)))
      as t(a);

    返回结果如下:

    +------+
    | _c0 |
    +------+
    | [{a:1, b:10}, {a:2, b:12}, {a:3, b:11}] |
    +------+

相关函数

  • ARRAY_SORT函数属于复杂类型函数,更多对复杂类型数据(例如ARRAY、MAP、STRUCT、JSON数据)的处理函数请参见复杂类型函数

  • ARRAY_SORT函数示例中涉及->的使用,关于Lambda函数->的介绍,详情请参见Lambda函数