将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) = -1
,compare(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) = 1
,compare(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 -1L ELSE 0L 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}] | +------+