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

45 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ja/sql-reference/functions/json-functions 105 JSON

JSONを解析するための関数は2つのセットがあります

simpleJSON (visitParam) 関数

ClickHouseには、簡易化されたJSONを操作するための特別な関数があります。これらのJSON関数は、JSONがどのようなものであるかについて強力な仮定に基づいています。可能な限り少ない労力で、できるだけ早く作業を完了することを目指しています。

次の仮定がされています:

  1. フィールド名(関数の引数)は定数でなければなりません。
  2. フィールド名は、JSONで標準的にエンコードされている必要があります。例えば、simpleJSONHas('{"abc":"def"}', 'abc') = 1 ですが、simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0
  3. フィールドは、どのネストレベルでも無差別に検索されます。複数の一致するフィールドがある場合、最初の出現が使用されます。
  4. JSONは文字列リテラル外にスペース文字を持ちません。

simpleJSONHas

field_nameという名前のフィールドがあるかどうかをチェックします。結果はUInt8です。

構文

simpleJSONHas(json, field_name)

別名: visitParamHas.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

  • フィールドが存在する場合は1を返し、存在しない場合は0を返します。UInt8

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":"true","qux":1}');

SELECT simpleJSONHas(json, 'foo') FROM jsons;
SELECT simpleJSONHas(json, 'bar') FROM jsons;

結果:

1
0

simpleJSONExtractUInt

field_nameという名前のフィールドの値からUInt64を解析します。文字列フィールドの場合、文字列の先頭から数値を解析しようとします。フィールドが存在しない場合、または数値を含まない場合、0を返します。

構文

simpleJSONExtractUInt(json, field_name)

別名: visitParamExtractUInt.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

  • フィールドが存在し、数値を含む場合はフィールドから解析された数を返し、それ以外の場合は0を返します。UInt64

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":"4e3"}');
INSERT INTO jsons VALUES ('{"foo":3.4}');
INSERT INTO jsons VALUES ('{"foo":5}');
INSERT INTO jsons VALUES ('{"foo":"not1number"}');
INSERT INTO jsons VALUES ('{"baz":2}');

SELECT simpleJSONExtractUInt(json, 'foo') FROM jsons ORDER BY json;

結果:

0
4
0
3
5

simpleJSONExtractInt

field_nameという名前のフィールドの値からInt64を解析します。文字列フィールドの場合は、文字列の先頭から数値を解析しようとします。フィールドが存在しない場合、または数値を含まない場合、0を返します。

構文

simpleJSONExtractInt(json, field_name)

別名: visitParamExtractInt.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

  • フィールドが存在し、数値を含む場合はフィールドから解析された数を返し、それ以外の場合は0を返します。Int64

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":"-4e3"}');
INSERT INTO jsons VALUES ('{"foo":-3.4}');
INSERT INTO jsons VALUES ('{"foo":5}');
INSERT INTO jsons VALUES ('{"foo":"not1number"}');
INSERT INTO jsons VALUES ('{"baz":2}');

SELECT simpleJSONExtractInt(json, 'foo') FROM jsons ORDER BY json;

結果:

0
-4
0
-3
5

simpleJSONExtractFloat

field_nameという名前のフィールドの値からFloat64を解析します。文字列フィールドの場合は、文字列の先頭から数値を解析しようとします。フィールドが存在しない場合、または数値を含まない場合、0を返します。

構文

simpleJSONExtractFloat(json, field_name)

別名: visitParamExtractFloat.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

  • フィールドが存在し、数値を含む場合はフィールドから解析された数を返し、それ以外の場合は0を返します。Float64

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":"-4e3"}');
INSERT INTO jsons VALUES ('{"foo":-3.4}');
INSERT INTO jsons VALUES ('{"foo":5}');
INSERT INTO jsons VALUES ('{"foo":"not1number"}');
INSERT INTO jsons VALUES ('{"baz":2}');

SELECT simpleJSONExtractFloat(json, 'foo') FROM jsons ORDER BY json;

結果:

0
-4000
0
-3.4
5

simpleJSONExtractBool

field_nameという名前のフィールドの値から真偽値を解析します。結果はUInt8です。

構文

simpleJSONExtractBool(json, field_name)

別名: visitParamExtractBool.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

フィールドの値がtrueの場合は1を、それ以外は0を返します。したがって、次の場合を含め(これらに限定されない)この関数は0を返します:

  • フィールドが存在しない場合。
  • フィールドが文字列としてtrueを含む場合、例: {"field":"true"}
  • フィールドが数値値として1を含む場合。

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":false,"bar":true}');
INSERT INTO jsons VALUES ('{"foo":"true","qux":1}');

SELECT simpleJSONExtractBool(json, 'bar') FROM jsons ORDER BY json;
SELECT simpleJSONExtractBool(json, 'foo') FROM jsons ORDER BY json;

結果:

0
1
0
0

simpleJSONExtractRaw

field_nameという名前のフィールドの値をセパレータを含むStringとして返します。

構文

simpleJSONExtractRaw(json, field_name)

別名: visitParamExtractRaw.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

  • フィールドが存在する場合は値をセパレータを含む文字列として返し、存在しない場合は空の文字列を返します。String

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":"-4e3"}');
INSERT INTO jsons VALUES ('{"foo":-3.4}');
INSERT INTO jsons VALUES ('{"foo":5}');
INSERT INTO jsons VALUES ('{"foo":{"def":[1,2,3]}}');
INSERT INTO jsons VALUES ('{"baz":2}');

SELECT simpleJSONExtractRaw(json, 'foo') FROM jsons ORDER BY json;

結果:


"-4e3"
-3.4
5
{"def":[1,2,3]}

simpleJSONExtractString

ダブルクォート付きのStringfield_nameという名前のフィールドの値から解析します。

構文

simpleJSONExtractString(json, field_name)

別名: visitParamExtractString.

パラメータ

  • json — フィールドが検索されるJSON。String
  • field_name — 検索されるフィールドの名前。String literal

返される値

  • フィールドの値をセパレータを含めて文字列として返します。フィールドがダブルクォート付き文字列を含まない場合、エスケープに失敗した場合、またはフィールドが存在しない場合は空の文字列を返します。String

実装の詳細

現在、基本多言語面に含まれない形式の\\uXXXX\\uYYYYに対応するコードポイントのサポートはありませんCESU-8に変換されますが、UTF-8には変換されません

クエリ:

CREATE TABLE jsons
(
    `json` String
)
ENGINE = Memory;

INSERT INTO jsons VALUES ('{"foo":"\\n\\u0000"}');
INSERT INTO jsons VALUES ('{"foo":"\\u263"}');
INSERT INTO jsons VALUES ('{"foo":"\\u263a"}');
INSERT INTO jsons VALUES ('{"foo":"hello}');

SELECT simpleJSONExtractString(json, 'foo') FROM jsons ORDER BY json;

結果:

\n\0

☺

JSONExtract 関数

次の関数はsimdjsonに基づいており、より複雑なJSONの解析要件に対応しています。

isValidJSON

渡された文字列が有効なJSONかどうかをチェックします。

構文

isValidJSON(json)

SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1
SELECT isValidJSON('not a json') = 0

JSONHas

JSONドキュメントに値が存在する場合は1を返します。値が存在しない場合は0を返します。

構文

JSONHas(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • jsonに値が存在する場合は1、それ以外の場合は0を返します。UInt8

クエリ:

SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1
SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0

要素の最小インデックスは1です。そのため、要素0は存在しません。整数を使ってJSON配列およびJSONオブジェクトにアクセスできます。例えば

SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'a'
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 2) = 'b'
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -1) = 'b'
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -2) = 'a'
SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'hello'

JSONLength

JSON配列またはJSONオブジェクトの長さを返します。値が存在しない、または間違った型の場合、0を返します。

構文

JSONLength(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • JSON配列またはJSONオブジェクトの長さを返します。値が存在しない、または不正な型の場合、0を返します。UInt64

SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3
SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2

JSONType

JSON値の型を返します。値が存在しない場合、Nullが返されます。

構文

JSONType(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • JSON値の型を文字列として返します。値が存在しない場合はNullを返します。String

SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}') = 'Object'
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'String'
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 'Array'

JSONExtractUInt

JSONを解析してUInt型の値を抽出します。

構文

JSONExtractUInt(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • UInt値が存在する場合はそれを返し、存在しない場合はNullを返します。UInt64

クエリ:

SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) as x, toTypeName(x);

結果:

┌───x─┬─toTypeName(x)─┐
│ 300 │ UInt64        │
└─────┴───────────────┘

JSONExtractInt

JSONを解析してInt型の値を抽出します。

構文

JSONExtractInt(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • Int値が存在する場合はそれを返し、存在しない場合はNullを返します。Int64

クエリ:

SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) as x, toTypeName(x);

結果:

┌───x─┬─toTypeName(x)─┐
│ 300 │ Int64         │
└─────┴───────────────┘

JSONExtractFloat

JSONを解析してInt型の値を抽出します。

構文

JSONExtractFloat(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • Float値が存在する場合はそれを返し、存在しない場合はNullを返します。Float64

クエリ:

SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) as x, toTypeName(x);

結果:

┌───x─┬─toTypeName(x)─┐
│ 200 │ Float64       │
└─────┴───────────────┘

JSONExtractBool

JSONを解析してブール値を抽出します。値が存在しないか間違った型の場合、0が返されます。

構文

JSONExtractBool(json\[, indices_or_keys\]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • ブール値が存在する場合はそれを返し、存在しない場合は0を返します。Bool

クエリ:

SELECT JSONExtractBool('{"passed": true}', 'passed');

結果:

┌─JSONExtractBool('{"passed": true}', 'passed')─┐
│                                             1 │
└───────────────────────────────────────────────┘

JSONExtractString

JSONを解析して文字列を抽出します。この関数はvisitParamExtractString関数と似ています。値が存在しないか間違った型の場合、空の文字列が返されます。

構文

JSONExtractString(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*.

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • jsonからエスケープ解除された文字列を返します。エスケープ解除に失敗した場合、値が存在しないか間違った型の場合は空の文字列を返します。String

SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'hello'
SELECT JSONExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
SELECT JSONExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
SELECT JSONExtractString('{"abc":"\\u263"}', 'abc') = ''
SELECT JSONExtractString('{"abc":"hello}', 'abc') = ''

JSONExtract

解析されたJSONから指定したClickHouseのデータ型の値を抽出します。この関数は以前のJSONExtract<type>関数の一般化バージョンです。つまり:

JSONExtract(..., 'String')JSONExtractString()と全く同じものを返します。 JSONExtract(..., 'Float64')JSONExtractFloat()と全く同じものを返します。

構文

JSONExtract(json [, indices_or_keys...], return_type)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*.
  • return_type — 抽出する値の型を指定する文字列。String

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • 指定された返却型の値が存在すればそれを返し、存在しない場合は指定された返却型に応じて0Null、または空の文字列を返します。 UInt64, Int64, Float64, BoolまたはString

SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(String, Array(Float64))') = ('hello',[-100,200,300])
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(b Array(Float64), a String)') = ([-100,200,300],'hello')
SELECT JSONExtract('{"a": "hello", "b": "world"}', 'Map(String, String)') = map('a',  'hello', 'b', 'world');
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 'Array(Nullable(Int8))') = [-100, NULL, NULL]
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4, 'Nullable(Int64)') = NULL
SELECT JSONExtract('{"passed": true}', 'passed', 'UInt8') = 1
SELECT JSONExtract('{"day": "Thursday"}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Thursday'
SELECT JSONExtract('{"day": 5}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Friday'

JSONExtractKeysAndValues

与えられたClickHouseデータ型の値を持つキー-値ペアをJSONから解析します。

構文

JSONExtractKeysAndValues(json [, indices_or_keys...], value_type)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, Int*.
  • value_type — 抽出する値の型を指定する文字列。String

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • 解析されたキー-値ペアの配列を返します。Array(Tuple(value_type))。

SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)];

JSONExtractKeys

JSON文字列を解析してキーを抽出します。

構文

JSONExtractKeys(json[, a, b, c...])

パラメータ

  • json — 有効なJSONを含むString
  • a, b, c... — ネストされたJSONオブジェクト内で内側のフィールドへのパスを指定するカンマ区切りのインデックスまたはキー。各引数は、キーによるフィールド取得に使うStringまたはN番目のフィールド取得に使うInteger。指定しない場合は、全体のJSONがトップレベルオブジェクトとして解析されます。オプションのパラメータ。

返される値

  • JSONのキーの配列を返します。Array(String)。

クエリ:

SELECT JSONExtractKeys('{"a": "hello", "b": [-100, 200.0, 300]}');

結果:

text
┌─JSONExtractKeys('{"a": "hello", "b": [-100, 200.0, 300]}')─┐
│ ['a','b']                                                  │
└────────────────────────────────────────────────────────────┘

JSONExtractRaw

未解析の文字列としてJSONの一部を返します。部分が存在しないか間違った型の場合、空の文字列が返されます。

構文

JSONExtractRaw(json [, indices_or_keys]...)

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, [Int*](../data-types/int-uint.md].

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • 未解析の文字列としてJSONの一部を返します。部分が存在しないか間違った型の場合、空の文字列が返されます。String

SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]';

JSONExtractArrayRaw

JSON配列の各要素を未解析の文字列として持つ配列を返します。部分が存在しないか配列でない場合は、空の配列が返されます。

構文

JSONExtractArrayRaw(json [, indices_or_keys...])

パラメータ

  • json — 解析するJSON文字列。String
  • indices_or_keys — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。String, [Int*](../data-types/int-uint.md].

indices_or_keys のタイプ:

  • 文字列 = キーによるオブジェクトメンバーへのアクセス。
  • 正の整数 = 開始からn番目のメンバー/キーへのアクセス。
  • 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。

返される値

  • 各要素が未解析の文字列として表されるJSON配列の要素を持つ配列を返します。それ以外の場合は、部分が存在しないか配列でない場合は空の配列を返します。Array(String)。

SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') = ['-100', '200.0', '"hello"'];

JSONExtractKeysAndValuesRaw

JSONオブジェクトからの生データを抽出します。

構文

JSONExtractKeysAndValuesRaw(json[, p, a, t, h])

引数

  • json — 有効なJSONを含むString
  • p, a, t, h — ネストされたJSONオブジェクト内で内側のフィールドへのパスを指定するカンマ区切りのインデックスまたはキー。各引数は、キーによるフィールド取得に使うstringまたはN番目のフィールド取得に使うinteger。指定しない場合は、全体のJSONがトップレベルオブジェクトとして解析されます。オプションのパラメータ。

返される値

  • ('key', 'value')タプルの配列。タプルの両要素は文字列です。Array(Tuple(String, String)。
  • 要求されたオブジェクトが存在しない場合、または入力JSONが無効な場合は空の配列。Array(Tuple(String, String)。

クエリ:

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}');

結果:

┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}')─┐
│ [('a','[-100,200]'),('b','{"c":{"d":"hello","f":"world"}}')]                                 │
└──────────────────────────────────────────────────────────────────────────────────────────────┘

クエリ:

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b');

結果:

┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b')─┐
│ [('c','{"d":"hello","f":"world"}')]                                                               │
└───────────────────────────────────────────────────────────────────────────────────────────────────┘

クエリ:

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c');

結果:

┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c')─┐
│ [('d','"hello"'),('f','"world"')]                                                                     │
└───────────────────────────────────────────────────────────────────────────────────────────────────────┘

JSON_EXISTS

JSONドキュメントに値が存在する場合は1を返します。値が存在しない場合は0を返します。

構文

JSON_EXISTS(json, path)

パラメータ

  • json — 有効なJSONを含む文字列。String
  • path — パスを表す文字列。String

:::note バージョン21.11より前だと引数の順序が誤っていました。つまり、JSON_EXISTS(path, json) :::

返される値

  • JSONドキュメントに値が存在すれば1、それ以外は0を返します。

SELECT JSON_EXISTS('{"hello":1}', '$.hello');
SELECT JSON_EXISTS('{"hello":{"world":1}}', '$.hello.world');
SELECT JSON_EXISTS('{"hello":["world"]}', '$.hello[*]');
SELECT JSON_EXISTS('{"hello":["world"]}', '$.hello[0]');

JSON_QUERY

JSONを解析してJSON配列またはJSONオブジェクトとして値を抽出します。値が存在しない場合は、空の文字列が返されます。

構文

JSON_QUERY(json, path)

パラメータ

  • json — 有効なJSONを含む文字列。String
  • path — パスを表す文字列。String

:::note バージョン21.11より前だと引数の順序が誤っていました。つまり、JSON_EXISTS(path, json) :::

返される値

  • 抽出された値をJSON配列またはJSONオブジェクトとして返します。それ以外の場合、値が存在しない場合は空の文字列を返します。String

クエリ:

SELECT JSON_QUERY('{"hello":"world"}', '$.hello');
SELECT JSON_QUERY('{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}', '$.array[*][0 to 2, 4]');
SELECT JSON_QUERY('{"hello":2}', '$.hello');
SELECT toTypeName(JSON_QUERY('{"hello":2}', '$.hello'));

結果:

["world"]
[0, 1, 4, 0, -1, -4]
[2]
String

JSON_VALUE

JSONを解析してJSONスカラーとして値を抽出します。値が存在しない場合は、デフォルトで空の文字列が返されます。

この関数は次の設定によって制御されます:

  • function_json_value_return_type_allow_nullabletrueに設定することで、NULLが返されます。値が複雑型(構造体、配列、マップのような)の場合、デフォルトで空の文字列が返されます。
  • function_json_value_return_type_allow_complextrueに設定することで、複雑な値が返されます。

構文

JSON_VALUE(json, path)

パラメータ

  • json — 有効なJSONを含む文字列。String
  • path — パスを表す文字列。String

:::note バージョン21.11より前だと引数の順序が誤っていました。つまり、JSON_EXISTS(path, json) :::

返される値

  • JSONスカラーとして抽出された値を返します。存在しない場合は空の文字列を返します。String

クエリ:

SELECT JSON_VALUE('{"hello":"world"}', '$.hello');
SELECT JSON_VALUE('{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}', '$.array[*][0 to 2, 4]');
SELECT JSON_VALUE('{"hello":2}', '$.hello');
SELECT toTypeName(JSON_VALUE('{"hello":2}', '$.hello'));
select JSON_VALUE('{"hello":"world"}', '$.b') settings function_json_value_return_type_allow_nullable=true;
select JSON_VALUE('{"hello":{"world":"!"}}', '$.hello') settings function_json_value_return_type_allow_complex=true;

結果:

world
0
2
String

toJSONString

値をそのJSON表現にシリアル化します。さまざまなデータ型やネストされた構造がサポートされます。 デフォルトで、64ビットの整数以上のもの(例: UInt64 または Int128)は引用符で囲まれます。output_format_json_quote_64bit_integersがこの動作を制御します。 特別な値NaNinfnull に置き換えられます。これを表示するには、output_format_json_quote_denormals設定を有効にします。 Enum値をシリアル化すると、その名前が出力されます。

構文

toJSONString(value)

引数

  • value — シリアル化する値。値は任意のデータ型である可能性があります。

返される値

  • 値のJSON表現。String

最初の例はMapのシリアル化を示しています。 2つ目の例は、Tupleにラップされた特別な値を示しています。

クエリ:

SELECT toJSONString(map('key1', 1, 'key2', 2));
SELECT toJSONString(tuple(1.25, NULL, NaN, +inf, -inf, [])) SETTINGS output_format_json_quote_denormals = 1;

結果:

{"key1":1,"key2":2}
[1.25,null,"nan","inf","-inf",[]]

関連リンク

JSONArrayLength

最も外側のJSON配列の要素数を返します。入力されたJSON文字列が無効な場合、関数はNULLを返します。

構文

JSONArrayLength(json)

別名: JSON_ARRAY_LENGTH(json)

引数

  • json — 有効なJSONを含むString

返される値

  • jsonが有効なJSON配列文字列であれば、配列要素の数を返し、それ以外の場合はNULLを返します。Nullable(UInt64)

SELECT
    JSONArrayLength(''),
    JSONArrayLength('[1,2,3]')

┌─JSONArrayLength('')─┬─JSONArrayLength('[1,2,3]')─┐
                ᴺᵁᴸᴸ                           3 
└─────────────────────┴────────────────────────────┘

jsonMergePatch

複数のJSONオブジェクトをマージして形成されたマージ済みのJSONオブジェクト文字列を返します。

構文

jsonMergePatch(json1, json2, ...)

引数

  • json — 有効なJSONを含むString

返される値

  • JSONオブジェクト文字列が有効であれば、マージ済みのJSONオブジェクト文字列を返します。String

SELECT jsonMergePatch('{"a":1}', '{"name": "joey"}', '{"name": "tom"}', '{"name": "zoey"}') AS res

┌─res───────────────────┐
 {"a":1,"name":"zoey"} 
└───────────────────────┘

JSONAllPaths

JSONカラム内の各行に保存されているすべてのパスのリストを返します。

構文

JSONAllPaths(json)

引数

返される値

CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory;
INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}}
SELECT json, JSONAllPaths(json) FROM test;
┌─json─────────────────────────────────┬─JSONAllPaths(json)─┐
│ {"a":"42"}                           │ ['a']              │
│ {"b":"Hello"}                        │ ['b']              │
│ {"a":["1","2","3"],"c":"2020-01-01"} │ ['a','c']          │
└──────────────────────────────────────┴────────────────────┘

JSONAllPathsWithTypes

JSONカラム内の各行に保存されているすべてのパスとそれらのデータ型のマップを返します。

構文

JSONAllPathsWithTypes(json)

引数

返される値

CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory;
INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}}
SELECT json, JSONAllPathsWithTypes(json) FROM test;
┌─json─────────────────────────────────┬─JSONAllPathsWithTypes(json)───────────────┐
│ {"a":"42"}                           │ {'a':'Int64'}                             │
│ {"b":"Hello"}                        │ {'b':'String'}                            │
│ {"a":["1","2","3"],"c":"2020-01-01"} │ {'a':'Array(Nullable(Int64))','c':'Date'} │
└──────────────────────────────────────┴───────────────────────────────────────────┘

JSONDynamicPaths

JSONカラム内に別々のサブカラムとして格納されている動的パスのリストを返します。

構文

JSONDynamicPaths(json)

引数

返される値

CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory;
INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}}
SELECT json, JSONDynamicPaths(json) FROM test;
┌─json─────────────────────────────────┬─JSONDynamicPaths(json)─┐
| {"a":"42"}                           │ ['a']                  │
│ {"b":"Hello"}                        │ []                     │
│ {"a":["1","2","3"],"c":"2020-01-01"} │ ['a']                  │
└──────────────────────────────────────┴────────────────────────┘

JSONDynamicPathsWithTypes

JSONカラム内で別々のサブカラムとして格納される動的パスとその型のマップを各行に返します。

構文

JSONAllPathsWithTypes(json)

引数

返される値

CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory;
INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}}
SELECT json, JSONDynamicPathsWithTypes(json) FROM test;
┌─json─────────────────────────────────┬─JSONDynamicPathsWithTypes(json)─┐
│ {"a":"42"}                           │ {'a':'Int64'}                   │
│ {"b":"Hello"}                        │ {}                              │
│ {"a":["1","2","3"],"c":"2020-01-01"} │ {'a':'Array(Nullable(Int64))'}  │
└──────────────────────────────────────┴─────────────────────────────────┘

JSONSharedDataPaths

JSONカラム内の共有データ構造に保存されているパスのリストを返します。

構文

JSONSharedDataPaths(json)

引数

返される値

CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory;
INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}}
SELECT json, JSONSharedDataPaths(json) FROM test;
┌─json─────────────────────────────────┬─JSONSharedDataPaths(json)─┐
│ {"a":"42"}                           │ []                        │
│ {"b":"Hello"}                        │ ['b']                     │
│ {"a":["1","2","3"],"c":"2020-01-01"} │ ['c']                     │
└──────────────────────────────────────┴───────────────────────────┘

JSONSharedDataPathsWithTypes

JSONカラム内で共有データ構造に保存されているパスとその型のマップを各行に返します。

構文

JSONSharedDataPathsWithTypes(json)

引数

返される値

CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory;
INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}}
SELECT json, JSONSharedDataPathsWithTypes(json) FROM test;
┌─json─────────────────────────────────┬─JSONSharedDataPathsWithTypes(json)─┐
│ {"a":"42"}                           │ {}                                 │
│ {"b":"Hello"}                        │ {'b':'String'}                     │
│ {"a":["1","2","3"],"c":"2020-01-01"} │ {'c':'Date'}                       │
└──────────────────────────────────────┴────────────────────────────────────┘