ClickHouse/docs/ja/sql-reference/functions/tuple-map-functions.md
2024-11-18 11:58:58 +09:00

30 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ja/sql-reference/functions/tuple-map-functions 120 マップ

map

キーと値のペアからMap(key, value)型の値を作成します。

構文

map(key1, value1[, key2, value2, ...])

引数

  • key_n — マップエントリのキー。Mapのキー型としてサポートされている任意の型。
  • value_n — マップエントリの値。Mapの値型としてサポートされている任意の型。

返される値

クエリ:

SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);

結果:

┌─map('key1', number, 'key2', multiply(number, 2))─┐
│ {'key1':0,'key2':0}                              │
│ {'key1':1,'key2':2}                              │
│ {'key1':2,'key2':4}                              │
└──────────────────────────────────────────────────┘

mapFromArrays

キーの配列またはマップと値の配列またはマップからマップを作成します。

この関数は、構文 CAST([...], 'Map(key_type, value_type)') の便利な代替です。 例えば、以下のように書く代わりに

  • CAST((['aa', 'bb'], [4, 5]), 'Map(String, UInt32)')、または
  • CAST([('aa',4), ('bb',5)], 'Map(String, UInt32)')

mapFromArrays(['aa', 'bb'], [4, 5]) と書くことができます。

構文

mapFromArrays(keys, values)

別名: MAP_FROM_ARRAYS(keys, values)

引数

  • keys — キーの配列またはマップ Array または Mapkeysが配列の場合は、その型として Array(Nullable(T)) または Array(LowCardinality(Nullable(T))) を許容しますが、NULL値は含めません。
  • values — 値の配列またはマップ Array または Map

返される値

  • キー配列と値配列/マップから構成されたキーと値を持つマップ。

クエリ:

select mapFromArrays(['a', 'b', 'c'], [1, 2, 3])

結果:

┌─mapFromArrays(['a', 'b', 'c'], [1, 2, 3])─┐
│ {'a':1,'b':2,'c':3}                       │
└───────────────────────────────────────────┘

mapFromArraysMap 型の引数も受け入れます。これらは実行中にタプルの配列にキャストされます。

SELECT mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3))

結果:

┌─mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3))─┐
│ {1:('a',1),2:('b',2),3:('c',3)}                       │
└───────────────────────────────────────────────────────┘
SELECT mapFromArrays(map('a', 1, 'b', 2, 'c', 3), [1, 2, 3])

結果:

┌─mapFromArrays(map('a', 1, 'b', 2, 'c', 3), [1, 2, 3])─┐
│ {('a',1):1,('b',2):2,('c',3):3}                       │
└───────────────────────────────────────────────────────┘

extractKeyValuePairs

キーと値のペアを含む文字列をMap(String, String)に変換します。 解析はノイズ(例: ログファイル)に対して寛容です。 入力文字列のキーと値のペアは、キー、キーと値の区切り文字、値で構成されています。 キーと値のペアはペア区切り文字で区切られています。 キーと値は引用符で囲むことができます。

構文

extractKeyValuePairs(data[, key_value_delimiter[, pair_delimiter[, quoting_character]]])

別名:

  • str_to_map
  • mapFromString

引数

  • data - キーと値のペアを抽出するための文字列。String または FixedString
  • key_value_delimiter - キーと値を区切る単一文字。デフォルトは :String または FixedString
  • pair_delimiters - ペアを区切る文字のセット。デフォルトは , , および ;String または FixedString
  • quoting_character - 引用符として使う単一文字。デフォルトは "String または FixedString

返される値

クエリ

SELECT extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv

結果:

┌─kv──────────────────────────────────────────────────────────────────────┐
│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil'}        │
└─────────────────────────────────────────────────────────────────────────┘

単一引用符 ' を引用符として使用する場合:

SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv

結果:

┌─kv───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil','last_key':'last_value'}                                 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

エスケープシーケンスをサポートしない場合:

SELECT extractKeyValuePairs('age:a\\x0A\\n\\0') AS kv

結果:

┌─kv─────────────────────┐
│ {'age':'a\\x0A\\n\\0'} │
└────────────────────────┘

toStringでシリアライズされたマップ文字列のキーと値のペアを復元するには:

SELECT
    map('John', '33', 'Paula', '31') AS m,
    toString(m) as map_serialized,
    extractKeyValuePairs(map_serialized, ':', ',', '\'') AS map_restored
FORMAT Vertical;

結果:

Row 1:
──────
m:              {'John':'33','Paula':'31'}
map_serialized: {'John':'33','Paula':'31'}
map_restored:   {'John':'33','Paula':'31'}

extractKeyValuePairsWithEscaping

extractKeyValuePairsと同じですが、エスケープをサポートしています。

サポートされているエスケープシーケンス: \x, \N, \a, \b, \e, \f, \n, \r, \t, \v および \0。 非標準のエスケープシーケンスは、そのまま(バックスラッシュを含む)返されますが、以下のいずれかを除きます:\\, ', ", backtick, /, = または ASCII制御文字c <= 31

この関数は、プリエスケープやポストエスケープが適切でないケースを満たします。例えば、以下のような入力文字列があるとします:a: "aaaa\"bbb"。期待される出力は:a: aaaa\"bbbb

  • プリエスケープ: プリエスケープすると、a: "aaaa"bbb" となり、extractKeyValuePairs はその後 a: aaaa を出力します。
  • ポストエスケープ: extractKeyValuePairsa: aaaa\ を出力し、ポストエスケープはそのまま保持します。

キーの前のエスケープシーケンスはスキップされ、値には無効とみなされます。

エスケープシーケンスに対するエスケープシーケンスサポートを有効にした場合:

SELECT extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') AS kv

結果:

┌─kv────────────────┐
│ {'age':'a\n\n\0'} │
└───────────────────┘

mapAdd

すべてのキーを収集し、対応する値を合計します。

構文

mapAdd(arg1, arg2 [, ...])

引数

引数は2つの配列タプルまたはマップで、最初の配列のアイテムがキーを表し、2つ目の配列が各キーの値を含みます。すべてのキー配列は同じ型を持ち、すべての値配列は、1つの型 (Int64UInt64 または Float64) に昇格される項目を含む必要があります。共通の昇格型が結果配列の型として使用されます。

返される値

  • 引数に応じて、1つのマップか、ソートされたキーを含む最初の配列と、そのキーに対応する値を含む2つ目の配列を持つタプルが返されます。

Map型を使ったクエリ:

SELECT mapAdd(map(1,1), map(1,1));

結果:

┌─mapAdd(map(1, 1), map(1, 1))─┐
│ {1:2}                        │
└──────────────────────────────┘

タプルを使ったクエリ:

SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type;

結果:

┌─res───────────┬─type───────────────────────────────┐
│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │
└───────────────┴────────────────────────────────────┘

mapSubtract

すべてのキーを収集し、対応する値を減算します。

構文

mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...])

引数

引数は2つの配列タプルまたはマップで、最初の配列のアイテムがキーを表し、2つ目の配列が各キーの値を含みます。すべてのキー配列は同じ型を持ち、すべての値配列は、1つの型 (Int64UInt64 または Float64) に昇格される項目を含む必要があります。共通の昇格型が結果配列の型として使用されます。

返される値

  • 引数に応じて、1つのマップか、ソートされたキーを含む最初の配列と、そのキーに対応する値を含む2つ目の配列を持つタプルが返されます。

Map型を使ったクエリ:

SELECT mapSubtract(map(1,1), map(1,1));

結果:

┌─mapSubtract(map(1, 1), map(1, 1))─┐
│ {1:0}                             │
└───────────────────────────────────┘

タプルマップを使ったクエリ:

SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type;

結果:

┌─res────────────┬─type──────────────────────────────┐
│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │
└────────────────┴───────────────────────────────────┘

mapPopulateSeries

整数キーを持つマップの欠落しているキーと値のペアを埋めます。 最大キーを指定することで、キーを最大値を超えて拡張することをサポートします。 具体的には、この関数はマップのキーを、最小から最大までの値(または指定された max 引数に1のステップサイズで形成し、対応する値を持つマップを返します。 値が指定されていないキーの場合は、デフォルト値が使用されます。 キーが重複する場合は、最初の値(出現順に)だけがそのキーに関連付けられます。

構文

mapPopulateSeries(map[, max])
mapPopulateSeries(keys, values[, max])

配列の引数については、keysvalues の各行内の要素数は同じである必要があります。

引数

引数は、整数キーを持つマップまたは2つの配列で、最初と2番目の配列が各キーのキーと値を含みます。

マップされた配列:

  • map — 整数キーを持つマップ。Map

または

返される値

  • 引数に応じて、ソートされた順序にあるキーを含むMapまたは2つの配列を持つタプル: キーに対応する値を持つ。

Map型を使ったクエリ:

SELECT mapPopulateSeries(map(1, 10, 5, 20), 6);

結果:

┌─mapPopulateSeries(map(1, 10, 5, 20), 6)─┐
│ {1:10,2:0,3:0,4:0,5:20,6:0}             │
└─────────────────────────────────────────┘

マップされた配列を使ったクエリ:

SELECT mapPopulateSeries([1,2,4], [11,22,44], 5) AS res, toTypeName(res) AS type;

結果:

┌─res──────────────────────────┬─type──────────────────────────────┐
│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │
└──────────────────────────────┴───────────────────────────────────┘

mapContains

指定されたキーが指定されたマップに含まれているかどうかを返します。

構文

mapContains(map, key)

引数

  • map — マップ。Map
  • key — キー。map のキー型と一致する型である必要があります。

返される値

  • mapkey を含む場合は 1、含まない場合は 0UInt8

クエリ:

CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;

INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapContains(a, 'name') FROM tab;

結果:

┌─mapContains(a, 'name')─┐
│                      1 │
│                      0 │
└────────────────────────┘

mapKeys

指定されたマップのキーを返します。

この関数は、設定 optimize_functions_to_subcolumns を有効にすることで最適化できます。 設定を有効にすると、関数はマップ全体の代わりに keys サブカラムのみを読み取ります。 クエリ SELECT mapKeys(m) FROM tableSELECT m.keys FROM table に変換されます。

構文

mapKeys(map)

引数

  • map — マップ。Map

返される値

  • map からすべてのキーを含む配列。Array

クエリ:

CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;

INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapKeys(a) FROM tab;

結果:

┌─mapKeys(a)────────────┐
│ ['name','age']        │
│ ['number','position'] │
└───────────────────────┘

mapValues

指定されたマップの値を返します。

この関数は、設定 optimize_functions_to_subcolumns を有効にすることで最適化できます。 設定を有効にすると、関数はマップ全体の代わりに values サブカラムのみを読み取ります。 クエリ SELECT mapValues(m) FROM tableSELECT m.values FROM table に変換されます。

構文

mapValues(map)

引数

  • map — マップ。Map

返される値

  • map からすべての値を含む配列。Array

クエリ:

CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;

INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapValues(a) FROM tab;

結果:

┌─mapValues(a)─────┐
│ ['eleven','11']  │
│ ['twelve','6.0'] │
└──────────────────┘

mapContainsKeyLike

構文

mapContainsKeyLike(map, pattern)

引数

  • map — マップ。Map
  • pattern - マッチングする文字列パターン。

返される値

  • 指定したパターンにマッチする keymap に含まれている場合は 1、そうでない場合は 0

クエリ:

CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;

INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});

SELECT mapContainsKeyLike(a, 'a%') FROM tab;

結果:

┌─mapContainsKeyLike(a, 'a%')─┐
│                           1 │
│                           0 │
└─────────────────────────────┘

mapExtractKeyLike

文字列キーを持つマップとLIKEパターンを与えると、この関数はキーがパターンと一致する要素を持つマップを返します。

構文

mapExtractKeyLike(map, pattern)

引数

  • map — マップ。Map
  • pattern - マッチングする文字列パターン。

返される値

  • 指定したパターンに一致するキーを持つ要素を含むマップ。一致する要素がない場合は、空のマップが返されます。

クエリ:

CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;

INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});

SELECT mapExtractKeyLike(a, 'a%') FROM tab;

結果:

┌─mapExtractKeyLike(a, 'a%')─┐
│ {'abc':'abc'}              │
│ {}                         │
└────────────────────────────┘

mapApply

マップの各要素に関数を適用します。

構文

mapApply(func, map)

引数

返される値

  • 各要素に func(map1[i], ..., mapN[i]) を適用して得られるオリジナルのマップからマップを返します。

クエリ:

SELECT mapApply((k, v) -> (k, v * 10), _map) AS r
FROM
(
    SELECT map('key1', number, 'key2', number * 2) AS _map
    FROM numbers(3)
)

結果:

┌─r─────────────────────┐
│ {'key1':0,'key2':0}   │
│ {'key1':10,'key2':20} │
│ {'key1':20,'key2':40} │
└───────────────────────┘

mapFilter

マップの各要素に関数を適用してフィルタリングします。

構文

mapFilter(func, map)

引数

返される値

  • func(map1[i], ..., mapN[i]) が0以外のものを返すmap内の要素のみを含むマップを返します。

クエリ:

SELECT mapFilter((k, v) -> ((v % 2) = 0), _map) AS r
FROM
(
    SELECT map('key1', number, 'key2', number * 2) AS _map
    FROM numbers(3)
)

結果:

┌─r───────────────────┐
│ {'key1':0,'key2':0} │
│ {'key2':2}          │
│ {'key1':2,'key2':4} │
└─────────────────────┘

mapUpdate

構文

mapUpdate(map1, map2)

引数

返される値

  • map2の対応キーに対する値が更新されたmap1を返します。

クエリ:

SELECT mapUpdate(map('key1', 0, 'key3', 0), map('key1', 10, 'key2', 10)) AS map;

結果:

┌─map────────────────────────────┐
│ {'key3':0,'key1':10,'key2':10} │
└────────────────────────────────┘

mapConcat

キーの等価性に基づいて複数のマップを連結します。 同じキーを持つ要素が複数の入力マップに存在する場合、すべての要素が結果マップに追加されますが、演算子 [] を介してアクセスできるのは最初の要素だけです。

構文

mapConcat(maps)

引数

返される値

  • 引数として渡されたマップを連結したマップを返します。

クエリ:

SELECT mapConcat(map('key1', 1, 'key3', 3), map('key2', 2)) AS map;

結果:

┌─map──────────────────────────┐
│ {'key1':1,'key3':3,'key2':2} │
└──────────────────────────────┘

クエリ:

SELECT mapConcat(map('key1', 1, 'key2', 2), map('key1', 3)) AS map, map['key1'];

結果:

┌─map──────────────────────────┬─elem─┐
│ {'key1':1,'key2':2,'key1':3} │    1 │
└──────────────────────────────┴──────┘

mapExists([func,], map)

mapの少なくとも1つのキー-値のペアが存在し、func(key, value) が0以外を返す場合に1を返します。それ以外の場合は0を返します。

:::note mapExists高次関数です。 最初の引数としてラムダ関数を渡すことができます。 :::

クエリ:

SELECT mapExists((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res

結果:

┌─res─┐
│   1 │
└─────┘

mapAll([func,] map)

mapのすべてのキー-値のペアに対してfunc(key, value)が0以外を返す場合に1を返します。それ以外の場合は0を返します。

:::note mapAll高次関数です。 最初の引数としてラムダ関数を渡すことができます。 :::

クエリ:

SELECT mapAll((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res

結果:

┌─res─┐
│   0 │
└─────┘

mapSort([func,], map)

マップの要素を昇順にソートします。 func 関数が指定された場合、マップのキーと値に適用されたfunc関数の結果によってソート順が決まります。

SELECT mapSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key1':3,'key2':2,'key3':1} │
└──────────────────────────────┘
SELECT mapSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key3':1,'key2':2,'key1':3} │
└──────────────────────────────┘

詳細は arraySort 関数のリファレンスを参照してください。

mapPartialSort

部分的なソートを許可する limit 引数を追加して、昇順にマップの要素をソートします。 func 関数が指定された場合、マップのキーと値に適用されたfunc関数の結果によってソート順が決まります。

構文

mapPartialSort([func,] limit, map)

引数

  • func マップのキーと値に適用するオプションの関数。ラムダ関数
  • limit ソートされる要素の範囲 [1..limit]。(U)Int
  • map ソートするマップ。Map

返される値

  • 部分的にソートされたマップ。Map

SELECT mapPartialSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2));
┌─mapPartialSort(lambda(tuple(k, v), v), 2, map('k1', 3, 'k2', 1, 'k3', 2))─┐
│ {'k2':1,'k3':2,'k1':3}                                                    │
└───────────────────────────────────────────────────────────────────────────┘

mapReverseSort([func,], map)

マップの要素を降順にソートします。 func 関数が指定された場合、マップのキーと値に適用されたfunc関数の結果によってソート順が決まります。

SELECT mapReverseSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key3':1,'key2':2,'key1':3} │
└──────────────────────────────┘
SELECT mapReverseSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key1':3,'key2':2,'key3':1} │
└──────────────────────────────┘

詳細は arrayReverseSort 関数のリファレンスを参照してください。

mapPartialReverseSort

追加のlimit引数を持つ部分的なソートを許可した上で、降順にマップの要素をソートします。 func 関数が指定された場合、マップのキーと値に適用されたfunc関数の結果によってソート順が決まります。

構文

mapPartialReverseSort([func,] limit, map)

引数

  • func マップのキーと値に適用するオプションの関数。ラムダ関数
  • limit ソートされる要素の範囲 [1..limit]。(U)Int
  • map ソートするマップ。Map

返される値

  • 部分的にソートされたマップ。Map

SELECT mapPartialReverseSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2));
┌─mapPartialReverseSort(lambda(tuple(k, v), v), 2, map('k1', 3, 'k2', 1, 'k3', 2))─┐
│ {'k1':3,'k3':2,'k2':1}                                                           │
└──────────────────────────────────────────────────────────────────────────────────┘