將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}] | +------+