メインコンテンツまでスキップ
メインコンテンツまでスキップ

Map(K, V)

データ型 Map(K, V) はキーと値のペアを保存します。

他のデータベースとは異なり、ClickHouse のマップは一意ではなく、つまり、マップには同じキーを持つ二つの要素を含めることができます。 (その理由は、マップが内部的に Array(Tuple(K, V)) として実装されているためです。)

m[k] という構文を使用して、マップ m 内のキー k に対する値を取得できます。 また、m[k] はマップをスキャンするため、操作の実行時間はマップのサイズに対して線形です。

パラメータ

  • K — マップキーの型。 NullableLowCardinality でネストされた Nullable 型を除く任意の型。
  • V — マップ値の型。任意の型。

マップ型のカラムを持つテーブルを作成します:

CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});

key2 の値を選択するには:

SELECT m['key2'] FROM tab;

結果:

┌─arrayElement(m, 'key2')─┐
│                      10 │
│                      20 │
│                      30 │
└─────────────────────────┘

リクエストされたキー k がマップに存在しない場合、m[k] は値の型のデフォルト値を返します。例えば、整数型の場合は 0、文字列型の場合は '' です。 マップにキーが存在するかどうかを確認するには、関数 mapContains を使用できます。

CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory;
INSERT INTO tab VALUES ({'key1':100}), ({});
SELECT m['key1'] FROM tab;

結果:

┌─arrayElement(m, 'key1')─┐
│                     100 │
│                       0 │
└─────────────────────────┘

Tuple から Map への変換

Tuple() 型の値は、関数 CAST を使用して Map() 型の値にキャストできます。

クエリ:

SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map;

結果:

┌─map───────────────────────────┐
│ {1:'Ready',2:'Steady',3:'Go'} │
└───────────────────────────────┘

マップのサブカラムを読み取る

マップ全体を読み込むのを避けるために、特定のケースではサブカラム keys および values を使用できます。

クエリ:

CREATE TABLE tab (m Map(String, UInt64)) ENGINE = Memory;
INSERT INTO tab VALUES (map('key1', 1, 'key2', 2, 'key3', 3));

SELECT m.keys FROM tab; --   same as mapKeys(m)
SELECT m.values FROM tab; -- same as mapValues(m)

結果:

┌─m.keys─────────────────┐
│ ['key1','key2','key3'] │
└────────────────────────┘

┌─m.values─┐
│ [1,2,3]  │
└──────────┘

関連情報