AnalyticDB for MySQL 3.1.1 以降では、ARRAY および MAP データの型がサポートされています。本ページでは、ARRAY 型について、その定義、制限事項、使用例、およびサポートされる関数を説明します。
定義
ARRAY は、同一のデータの型を持つ要素のコレクションを格納するものであり、重複を許容します。これは Java のリストと類似しています。配列内のすべての要素は、同じデータの型である必要があります。たとえば、列に対して array<int> を定義した場合、その列のすべての要素は INT 型となります。
ネストされた配列もサポートされます。例: array<array<string>>。
制限事項
ARRAY または MAP 型の列には、インデックスを作成できません。
配列データを効率的にフィルター処理するには、SQL クエリ内で検索条件を組み合わせて、配列全体をスキャンしないようにしてください。スキャン対象となるデータ量を最小限に抑えることで、クエリのパフォーマンスを向上させることができます。
配列の操作
テーブルの作成
以下のステートメントは、2 つの配列型の列を含むテーブルを作成します。b 列は array<int> 型、c 列は array<array<string>> 型です。
Create Table `array_test` (
`a` int,
`b` array<int>,
`c` array<array<string>>,
primary key (`a`)
) DISTRIBUTED BY HASH(`a`)データの挿入
配列値は JSON 文字列として挿入します。以下のステートメントは、b が [1,2,3]、c が [["a"],["b","c"]] である行を挿入します。
insert into array_test values (1, '[1,2,3]', '[["a"],["b","c"]]');データのクエリ実行
テーブルからすべての行を取得するクエリを実行します:
mysql> select * from array_test;
+------+---------+-------------------+
| a | b | c |
+------+---------+-------------------+
| 1 | [1,2,3] | [["a"],["b","c"]] |
+------+---------+-------------------+
1 row in set (0.08 sec)ARRAY および MAP 型の列は、JSON 形式で返されます。たとえば、c[2] はネストされた array<string> のサブカラムであり、JSON 配列として返されます。
配列要素へのアクセス
添字による要素の取得には、角括弧表記または element_at 関数を使用します。
配列の添字は 1 から始まり、0 ではありません。b[1] と element_at(b, 1) は等価です。
以下の表は、両方のアクセス構文とその結果を示しています:
| 式 | 結果 |
|---|---|
b[1] | 1(b の先頭要素) |
element_at(b, 1) | 1(b の先頭要素) |
c[2] | ["b","c"](c の 2 番目の要素) |
element_at(c, 2) | ["b","c"](c の 2 番目の要素) |
完全なクエリ例を以下に示します:
mysql> select a,b[1],element_at(b,1),c[2],element_at(c,2) from array_test;
+------+------+-----------------+-----------+-----------------+
| a | b[1] | element_at(b,1) | c[2] | element_at(c,2) |
+------+------+-----------------+-----------+-----------------+
| 1 | 1 | 1 | ["b","c"] | ["b","c"] |
+------+------+-----------------+-----------+-----------------+
1 row in set (0.11 sec)サポートされる関数
| 関数 | 説明 | 戻り値の型 |
|---|---|---|
element_at | 指定された添字(1 基準)の要素を返します。例:element_at(array[1,2], 1) は 1 を返します。 | T |
size | 配列内の要素数を返します。 | int |
contains | 配列に指定された値が含まれているかどうかを返します。例:contains(array[1,2], 2) は 1 を返します。 | BOOL |
array_max | 配列内の最大要素を返します。 | T |
array_min | 配列内の最小要素を返します。 | T |
array_position | 要素の最初の出現位置のインデックスを返します。例:array_position(array['a','b','b'],'b') は 2 を返します。 | int |
array_remove | 指定された値と等しいすべての要素を削除します。例:array_remove(array['a','b','b'],'b') は ['a'] を返します。 | array<T> |
array_sort | 配列をソートします。例:array_sort(array[3,2,1]) は [1,2,3] を返します。 | array<T> |
reverse | 要素の順序を逆転します。例:reverse(array[5,9,3]) は [3,9,5] を返します。 | array<T> |
shuffle | 要素をランダムな順序で並べ替えた配列を返します。例:shuffle(array[1,5,8]) は [5,1,8] を返す可能性があります。 | array<T> |
slice | 部分配列を返します。start は 1 基準の開始インデックス、length は返す要素数です。例:slice(array[1,2,3,4,5], 3, 2) は [3,4] を返します。 | array<T> |
concat | 2 つ以上の配列をマージし、重複を保持します。例:concat(array[1], array[1,2]) は [1,1,2] を返します。 | array<T> |
array_distinct | 配列から重複要素を削除します。例:array_distinct(array[1,1,2]) は [1,2] を返します。 | array<T> |
array_union | 2 つ以上の配列をマージし、重複を削除します。例:array_union(array[1], array[1,2]) は [1,2] を返します。 | array<T> |
array_intersect | すべての入力配列に共通して出現する要素を返します。例:array_intersect(array[1], array[1,2]) は [1] を返します。 | array<T> |
array_join | 指定されたデリミタを使用して、配列要素を文字列に連結します。例:array_join(array[1,2,3,4],'a') は 1a2a3a4 を返します。 | string |
flatten | ネストされた配列を単一レベルの配列にフラット化します。例:flatten(array[array[1,2],array[3]]) は [1,2,3] を返します。 | array<X> |