メインコンテンツまでスキップ
バージョン: Candidate-4.1

array_sort

配列の要素を昇順にソートします。v4.0 以降、array_sort はラムダコンパレータをサポートしています。

構文

-- ラムダコンパレータを使用しない
array_sort(array)

-- ラムダコンパレータを使用する
array_sort(array, (x,y)->expr(x,y))

パラメータ

array: ソートする要素を持つ配列。ARRAYデータ型のみがサポートされています。

lambda_comparator: (x,y)->expr(x,y) の形式を持つオプションのラムダ関数コンパレータ。ラムダコンパレータは次のとおりです。

  • 引数 x と y のみに依存する必要があります
  • ブール型または数値型を返す必要があります
  • 結果は NULL であってはなりません
  • 厳密な弱順序付けの要件を満たす必要があります

戻り値

配列を返します。

使用上の注意

基本的なソート

  • この関数は、ラムダコンパレータなしで使用すると、配列の要素を昇順にソートします。
  • NULL の値は、返される配列の先頭に配置されます。
  • 返される配列の要素は、入力配列の要素と同じデータ型を持ちます。

ラムダコンパレータによるソート

  • ラムダコンパレータを使用する場合、ソート順は式の結果によって決定されます。

    • ブール値の戻り値の場合: true は x が y の前に来るべきであることを意味します
    • 数値の戻り値の場合: 負の値は x が y の前に来ることを意味します
  • ラムダコンパレータは、厳密な弱順序付けの要件を満たす必要があります。

    • 非反射性: すべての x について、expr(x, x) は false(ブール値)または非負(数値)を返す必要があります
    • 非対称性: expr(x, y) が成り立つ場合、expr(y, x) は成り立ってはなりません
    • 推移性: expr(x, y)expr(y, z) が成り立つ場合、expr(x, z) は成り立たなければなりません
    • 連結性: すべての xy について、次のいずれかが真でなければなりません。
      • expr(x, y)
      • expr(y, x)
      • x = y
  • ラムダコンパレータ式は次の条件を満たす必要があります。

    • パラメータ xy のみに依存する
    • ブール型または数値型を返す
    • NULL を返さない
    • 同じ入力値に対して常に一貫した結果を生成する

降順

配列の要素を降順にソートしたい場合は、reverse関数を使用します。

基本的な例

以下の表を例として使用します。

mysql> select * from test;
+------+--------------+
| c1 | c2 |
+------+--------------+
| 1 | [4,3,null,1] |
| 2 | NULL |
| 3 | [null] |
| 4 | [8,5,1,4] |
+------+--------------+

c2 の値を昇順でソートします。

mysql> select c1, array_sort(c2) from test;
+------+------------------+
| c1 | array_sort(`c2`) |
+------+------------------+
| 1 | [null,1,3,4] |
| 2 | NULL |
| 3 | [null] |
| 4 | [1,4,5,8] |
+------+------------------+

ラムダコンパレータの例

ラムダコンパレータを使用して整数の配列を降順でソートします。

mysql> select array_sort([3,1,4,2], (x,y) -> x > y);
+-------------------------------------------+
| array_sort([3, 1, 4, 2], (x, y) -> x > y) |
+-------------------------------------------+
| [4, 3, 2, 1] |
+-------------------------------------------+

数値の戻り値を使用して整数の配列をソートします。

mysql> select array_sort([3,1,4,2], (x,y) -> x - y);
+-------------------------------------------+
| array_sort([3, 1, 4, 2], (x, y) -> x - y) |
+-------------------------------------------+
| [1, 2, 3, 4] |
+-------------------------------------------+

文字列の配列を長さでソートします。

mysql> select array_sort(['apple', 'banana', 'cherry', 'date'], (x,y) -> length(x) - length(y));
+------------------------------------------------------------------------------------+
| array_sort(['apple', 'banana', 'cherry', 'date'], (x, y) -> length(x) - length(y)) |
+------------------------------------------------------------------------------------+
| ['date', 'apple', 'banana', 'cherry'] |
+------------------------------------------------------------------------------------+

ブール値の戻り値を使用して文字列の配列をアルファベット順にソートします。

mysql> select array_sort(['banana', 'apple', 'cherry'], (x,y) -> x > y);
+------------------------------------------------------------+
| array_sort(['banana', 'apple', 'cherry'], (x, y) -> x > y) |
+------------------------------------------------------------+
| ['apple', 'banana', 'cherry'] |
+------------------------------------------------------------+

カスタムビジネスロジックで配列をソートします(偶数を先に、次に奇数をソート)。

mysql> select array_sort([5,2,8,1,9,4], (x,y) -> 
case when x % 2 = 0 and y % 2 = 0 then x - y
when x % 2 = 0 and y % 2 = 1 then -1
when x % 2 = 1 and y % 2 = 0 then 1
else x - y end);
+--------------------------------------------------------------------------------------------------------------------+
| array_sort([5, 2, 8, 1, 9, 4], (x, y) -> case when x % 2 = 0 and y % 2 = 0 then x - y when x % 2 = 0 and y % 2 = 1 then -1 when x % 2 = 1 and y % 2 = 0 then 1 else x - y end) |
+--------------------------------------------------------------------------------------------------------------------+
| [2, 4, 8, 1, 5, 9] |
+--------------------------------------------------------------------------------------------------------------------+

カスタム精度比較で小数点の配列をソートします。

mysql> select array_sort([3.141, 2.718, 1.414, 2.236], (x,y) -> round(x, 2) - round(y, 2));
+----------------------------------------------------------------------------------------+
| array_sort([3.141, 2.718, 1.414, 2.236], (x, y) -> round(x, 2) - round(y, 2)) |
+----------------------------------------------------------------------------------------+
| [1.414, 2.236, 2.718, 3.141] |
+----------------------------------------------------------------------------------------+
Rocky the happy otterStarRocks Assistant

AI generated answers are based on docs and other sources. Please test answers in non-production environments.