MAP 型はキーと値のペアを格納するデータの型であり、AnalyticDB for MySQL 3.1.1 以降でサポートされます。
定義
MAP 列では、キーが対応する値にマッピングされます。
キーには基本データ型を指定する必要があります:
TINYINT、BOOLEAN、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、またはSTRINGです。値には基本データ型、MAP 型、または ARRAY 型を指定できます。これにより、ネストされた構造を実現できます。
たとえば、フラットなマップには map<int, string> を定義し、ネストされたマップには map<int, map<int, string>> を定義します。
注意事項
MAP 列および ARRAY 列にはインデックスはサポートされていません。SQL ステートメント内でフィルター条件を指定して、スキャン対象となるデータ量を削減してください。
マップ内のキーは一意である必要があります。
キーの挿入順序は保持されません。たとえば、
{"a":1,"b":2,"d":3}を挿入しても、返される結果は{"d":3,"a":1,"b":2}のようになる場合があります。
使用例
テーブルの作成
CREATE TABLE map_test (
`a` INT,
`b` MAP<INT, STRING>,
`c` MAP<INT, MAP<INT, STRING>>,
PRIMARY KEY (`a`)
) DISTRIBUTED BY HASH(`a`);データの挿入
INSERT INTO map_test VALUES (1, '{1:"a"}', '{1:{11:"a"},2:{22:"b"}}');データの照会
SELECT * FROM map_test;+------+---------+-------------------------+
| a | b | c |
+------+---------+-------------------------+
| 1 | {1:"a"} | {1:{11:"a"},2:{22:"b"}} |
+------+---------+-------------------------+
1 row in set (0.07 sec)element_at 関数を使用すると、キーを指定して値を取得できます。引数には添字ではなく、キーを指定します。
SELECT element_at(c, 1), element_at(element_at(c, 1), 11) FROM map_test;+-----------------+--------------------------------+
| element_at(c,1) | element_at(element_at(c,1),11) |
+-----------------+--------------------------------+
| {11:"a"} | a |
+-----------------+--------------------------------+
1 row in set (0.07 sec)map_keys 関数および map_values 関数を使用すると、すべてのキーまたは値を配列として抽出できます。size 関数は、キーと値の合計数を返します。
SELECT map_keys(b), map_values(b), size(b), size(map_keys(b)), size(map_values(b)) FROM map_test;+-------------+---------------+---------+-------------------+---------------------+
| map_keys(b) | map_values(b) | size(b) | size(map_keys(b)) | size(map_values(b)) |
+-------------+---------------+---------+-------------------+---------------------+
| [1] | ["a"] | 2 | 1 | 1 |
+-------------+---------------+---------+-------------------+---------------------+
1 row in set (0.08 sec)SELECT map_keys(c), map_values(c), size(c), size(map_keys(c)), size(map_values(c)) FROM map_test;+-------------+---------------------+---------+-------------------+---------------------+
| map_keys(c) | map_values(c) | size(c) | size(map_keys(c)) | size(map_values(c)) |
+-------------+---------------------+---------+-------------------+---------------------+
| [1,2] | [{11:"a"},{22:"b"}] | 4 | 2 | 2 |
+-------------+---------------------+---------+-------------------+---------------------+
1 row in set (0.08 sec)サポートされる関数
| 関数 | 説明 | 使用例 | 戻り値の型 |
|---|---|---|---|
element_at | 指定されたキーに対応する値を返します。 | element_at(map(array["a","b"], array[1,2]), a) → 1 | V |
size | キーと値の合計数を返します。 | size(map(array["a","b"], array[1,2])) → 4 | INT |
map_keys | すべてのキーを配列として返します。 | map_keys(map(array["a","b"], array[1,2])) → ["a","b"] | ARRAY<K> |
map_values | すべての値を配列として返します。 | map_values(map(array["a","b"], array[1,2])) → [1,2] | ARRAY<V> |