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

JSON 機能

JSON 関数の種類

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

  • simpleJSON* (visitParam*) は、限られた JSON のサブセットを非常に高速で解析するために作成されています。
  • JSONExtract* は、通常の JSON を解析するために作成されています。

simpleJSON (visitParam) 関数

ClickHouse には、簡略化された JSON を扱うための特別な関数があります。これらの JSON 関数は、JSON の内容に関する強い仮定に基づいています。彼らは、できるだけ少ない作業でできるだけ早くタスクを完了しようとします。

以下の仮定がなされます:

  1. フィールド名(関数引数)は定数でなければなりません。
  2. フィールド名は JSON 内で何らかの形で標準的にエンコードされています。たとえば: simpleJSONHas('{"abc":"def"}', 'abc') = 1 ですが、 simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0 です。
  3. フィールドは任意のネストレベルで無差別に検索されます。一致するフィールドが複数ある場合は、最初の出現が使用されます。
  4. JSON には文字列リテラルの外に空白文字が存在しません。

JSONExtract 関数

これらの関数は simdjson に基づいており、より複雑な JSON 解析要件に対応するように設計されています。

大文字と小文字を区別しない JSONExtract 関数

これらの関数は、JSON オブジェクトから値を抽出する際に ASCII の大文字と小文字を区別しないキー一致を行います。 それは、ケースセンシティブな対応物と同様に機能しますが、オブジェクトのキーはケースを無視して一致します。 大文字と小文字が異なる複数のキーが一致する場合、最初の一致が返されます。

注記

これらの関数は、大文字と小文字を区別する対応物よりもパフォーマンスが劣る可能性があるため、可能であれば通常の JSONExtract 関数を使用してください。

JSONAllPaths

導入: v24.8

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

構文

JSONAllPaths(json)

引数

  • json — JSON カラム。 JSON

返される値

JSON カラム内のすべてのパスの配列を返します。 Array(String)

使用例

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

導入: v24.8

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

構文

JSONAllPathsWithTypes(json)

引数

  • json — JSON カラム。 JSON

返される値

JSON カラム内のすべてのパスとそのデータ型のマップを返します。 Map(String, String)

使用例

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'} │
└──────────────────────────────────────┴───────────────────────────────────────────┘

JSONArrayLength

導入: v23.2

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

構文

JSONArrayLength(json)

引数

  • json — 有効な JSON を含む文字列。 String

返される値

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

使用例

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

JSONDynamicPaths

導入: v24.8

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

構文

JSONDynamicPaths(json)

引数

  • json — JSON カラム。 JSON

返される値

JSON カラム内の動的パスの配列を返します。 Array(String)

使用例

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

導入: v24.8

JSON カラム内の各行に保存されている別々のサブカラムとしての動的パスとそのタイプのリストを返します。

構文

JSONDynamicPathsWithTypes(json)

引数

  • json — JSON カラム。 JSON

返される値

JSON カラム内の動的パスとそのデータ型のマップを返します。 Map(String, String)

使用例

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))'}  │
└──────────────────────────────────────┴─────────────────────────────────┘

JSONExtract

導入: v19.14

JSON を解析し、指定された ClickHouse データ型の値を抽出します。

構文

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

引数

  • json — 解析する JSON 文字列。 String
  • return_type — 返す ClickHouse データ型。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

可能な場合は指定された ClickHouse データ型の値を返します。そうでない場合は、その型のデフォルト値を返します。

使用例

SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(String, Array(Float64))') AS res;
┌─res──────────────────────────────┐
│ ('hello',[-100,200,300])         │
└──────────────────────────────────┘

JSONExtractArrayRaw

導入: v20.1

JSON 配列の要素を含む配列を返し、それぞれは未解析の文字列として表現されます。

構文

JSONExtractArrayRaw(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

JSON 配列要素の文字列の配列を返します。部分が配列でない場合、または存在しない場合、空の配列が返されます。 Array(String)

使用例

SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') AS res;
┌─res──────────────────────────┐
│ ['-100','200.0','"hello"']   │
└──────────────────────────────┘

JSONExtractArrayRawCaseInsensitive

導入: v25.8

JSON 配列の要素を含む配列を返し、それぞれは未解析の文字列として表現されます。ケースインセンシティブなキー一致を使用します。この関数は JSONExtractArrayRaw に類似しています。

構文

JSONExtractArrayRawCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。配列に移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

未解析の JSON 文字列の配列を返します。 Array(String)

基本

SELECT JSONExtractArrayRawCaseInsensitive('{"Items": [1, 2, 3]}', 'ITEMS')
['1','2','3']

JSONExtractBool

導入: v20.1

JSON を解析し、Bool 型の値を抽出します。

構文

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

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

存在する場合は Bool 値を返します。それ以外の場合は 0 を返します。 Bool

使用例

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

JSONExtractBoolCaseInsensitive

導入: v25.8

JSON を解析し、ケースインセンシティブなキー一致を使用してブール値を抽出します。この関数は JSONExtractBool に類似しています。

構文

JSONExtractBoolCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

抽出したブール値 (true の場合は 1、false の場合は 0) を返します。見つからない場合は 0 を返します。 UInt8

基本

SELECT JSONExtractBoolCaseInsensitive('{"IsActive": true}', 'isactive')
1

JSONExtractCaseInsensitive

導入: v25.8

JSON を解析し、ケースインセンシティブなキー一致を使用して指定された ClickHouse データ型の値を抽出します。この関数は JSONExtract に類似しています。

構文

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

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*
  • return_type — 抽出する ClickHouse データ型 String

返される値

指定されたデータ型の抽出された値を返します。 Any

int_type

SELECT JSONExtractCaseInsensitive('{"Number": 123}', 'number', 'Int32')
123

array_type

SELECT JSONExtractCaseInsensitive('{"List": [1, 2, 3]}', 'list', 'Array(Int32)')
[1,2,3]

JSONExtractFloat

導入: v20.1

JSON を解析し、Float 型の値を抽出します。

構文

JSONExtractFloat(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

存在する場合は Float 値を返します。それ以外の場合は 0 を返します。 Float64

使用例

SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) AS res;
┌─res─┐
│ 200 │
└─────┘

JSONExtractFloatCaseInsensitive

導入: v25.8

JSON を解析し、ケースインセンシティブなキー一致を使用して Float 型の値を抽出します。この関数は JSONExtractFloat に類似しています。

構文

JSONExtractFloatCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

抽出した Float 値を返します。見つからない場合や変換できない場合は 0 を返します。 Float64

基本

SELECT JSONExtractFloatCaseInsensitive('{"Price": 12.34}', 'PRICE')
12.34

JSONExtractInt

導入: v20.1

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

構文

JSONExtractInt(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

存在する場合は Int 値を返します。それ以外の場合は 0 を返します。 Int64

使用例

SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 1) AS res;
┌─res─┐
│ 200 │
└─────┘

JSONExtractIntCaseInsensitive

導入: v25.8

JSON を解析し、ケースインセンシティブなキー一致を使用して Int 型の値を抽出します。この関数は JSONExtractInt に類似しています。

構文

JSONExtractIntCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

抽出した Int 値を返します。見つからない場合や変換できない場合は 0 を返します。 Int64

基本

SELECT JSONExtractIntCaseInsensitive('{"Value": 123}', 'value')
123

ネストされた

SELECT JSONExtractIntCaseInsensitive('{"DATA": {"COUNT": 42}}', 'data', 'Count')
42

JSONExtractKeys

導入: v21.11

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

構文

JSONExtractKeys(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

JSON オブジェクトのキーを含む配列を返します。 Array(String)

使用例

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

JSONExtractKeysAndValues

導入: v20.1

JSON からキーと値のペアを抽出します。値は指定した ClickHouse データ型です。

構文

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

引数

  • json — 解析する JSON 文字列。 String
  • value_type — 値の ClickHouse データ型。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

解析されたキーと値のペアのタプルを含む配列を返します。 Array(Tuple(String, value_type))

使用例

SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'Int8', 'x') AS res;
┌─res────────────────────┐
│ [('a',5),('b',7),('c',11)] │
└────────────────────────┘

JSONExtractKeysAndValuesCaseInsensitive

導入: v25.8

JSON からキーと値のペアを抽出し、ケースインセンシティブなキー一致を使用します。この関数は JSONExtractKeysAndValues に類似しています。

構文

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

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。オブジェクトに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*
  • value_type — 値の ClickHouse データ型 String

返される値

キーと値のペアを含むタプルの配列を返します。 Array(Tuple(String, T))

基本

SELECT JSONExtractKeysAndValuesCaseInsensitive('{"Name": "Alice", "AGE": 30}', 'String')
[('Name','Alice'),('AGE','30')]

JSONExtractKeysAndValuesRaw

導入: v20.4

JSON オブジェクトからキーと値のペアを含む配列を返します。すべての値は未解析の文字列として表現されます。

構文

JSONExtractKeysAndValuesRaw(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

未解析の文字列のキーと値のペアを含むタプルの配列を返します。 Array(Tuple(String, String))

使用例

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b": "hello"}') AS res;
┌─res──────────────────────────────────┐
│ [('a','[-100,200.0]'),('b','"hello"')] │
└──────────────────────────────────────┘

JSONExtractKeysAndValuesRawCaseInsensitive

導入: v25.8

ケースインセンシティブなキー一致を使用して JSON から未解析のキーと値のペアを抽出します。この関数は JSONExtractKeysAndValuesRaw に類似しています。

構文

JSONExtractKeysAndValuesRawCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。オブジェクトに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

未解析の文字列としてキーと値のペアを含むタプルの配列を返します。 Array(Tuple(String, String))

基本

SELECT JSONExtractKeysAndValuesRawCaseInsensitive('{"Name": "Alice", "AGE": 30}')
[('Name','"Alice"'),('AGE','30')]

JSONExtractKeysCaseInsensitive

導入: v25.8

JSON 文字列を解析し、ケースインセンシティブなキー一致を使用して階層オブジェクトへのナビゲーションを行い、キーを抽出します。この関数は JSONExtractKeys に類似しています。

構文

JSONExtractKeysCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。オブジェクトに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

JSON オブジェクトからのキーの配列を返します。 Array(String)

基本

SELECT JSONExtractKeysCaseInsensitive('{"Name": "Alice", "AGE": 30}')
['Name','AGE']

ネストされた

SELECT JSONExtractKeysCaseInsensitive('{"User": {"name": "John", "AGE": 25}}', 'user')
['name','AGE']

JSONExtractRaw

導入: v20.1

JSON の一部を未解析の文字列として返します。

構文

JSONExtractRaw(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

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

使用例

SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') AS res;
┌─res──────────────┐
│ [-100,200.0,300] │
└──────────────────┘

JSONExtractRawCaseInsensitive

導入: v25.8

ケースインセンシティブなキー一致を使用して JSON の一部を未解析の文字列として返します。この関数は JSONExtractRaw に類似しています。

構文

JSONExtractRawCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

抽出された要素の生の JSON 文字列を返します。 String

オブジェクト

SELECT JSONExtractRawCaseInsensitive('{"Object": {"key": "value"}}', 'OBJECT')
{"key":"value"}

JSONExtractString

導入: v20.1

JSON を解析し、String 型の値を抽出します。

構文

JSONExtractString(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

存在する場合は String 値を返します。それ以外の場合は空の文字列を返します。 String

使用例

SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') AS res;
┌─res───┐
│ hello │
└───────┘

JSONExtractStringCaseInsensitive

導入: v25.8

JSON を解析し、ケースインセンシティブなキー一致を使用して文字列を抽出します。この関数は JSONExtractString に類似しています。

構文

JSONExtractStringCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

抽出された文字列値を返します。見つからない場合は空の文字列を返します。 String

基本

SELECT JSONExtractStringCaseInsensitive('{"ABC": "def"}', 'abc')
def

ネストされた

SELECT JSONExtractStringCaseInsensitive('{"User": {"Name": "John"}}', 'user', 'name')
John

JSONExtractUInt

導入: v20.1

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

構文

JSONExtractUInt(json [, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列。 String
  • indices_or_keys — 文字列または整数のいずれかを含む引数のゼロまたはそれ以上のリスト。 String または (U)Int*

返される値

存在する場合は UInt 値を返します。それ以外の場合は 0 を返します。 UInt64

使用例

SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) AS res;
┌─res─┐
│ 300 │
└─────┘

JSONExtractUIntCaseInsensitive

導入: v25.8

JSON を解析し、ケースインセンシティブなキー一致を使用して UInt 型の値を抽出します。この関数は JSONExtractUInt に類似しています。

構文

JSONExtractUIntCaseInsensitive(json [, indices_or_keys]...)

引数

  • json — 解析する JSON 文字列 String
  • indices_or_keys — 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String または (U)Int*

返される値

抽出された UInt 値を返します。見つからない場合や変換できない場合は 0 を返します。 UInt64

基本

SELECT JSONExtractUIntCaseInsensitive('{"COUNT": 789}', 'count')
789

JSONHas

導入: v20.1

提供された値が JSON ドキュメント内に存在するかどうかを確認します。

構文

JSONHas(json[ ,indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列 String
  • [ ,indices_or_keys, ...] — ゼロまたはそれ以上の引数のリスト。 String または (U)Int*

返される値

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

JSONLength

導入: v20.1

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

構文

JSONLength(json [, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列 String
  • [, indices_or_keys, ...] — 省略可能。ゼロまたはそれ以上の引数のリスト。 String または (U)Int8/16/32/64

返される値

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;
1
1

JSONMergePatch

導入: v23.10

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

構文

jsonMergePatch(json1[, json2, ...])

引数

  • json1[, json2, ...] — 有効な JSON の文字列が 1 つ以上。 String

返される値

マージされた JSON オブジェクトの文字列を返します。JSON オブジェクト文字列が有効である場合。 String

使用例

SELECT jsonMergePatch('{"a":1}', '{"name": "joey"}', '{"name": "tom"}', '{"name": "zoey"}') AS res;
┌─res───────────────────┐
│ {"a":1,"name":"zoey"} │
└───────────────────────┘

JSONSharedDataPaths

導入: v24.8

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

構文

JSONSharedDataPaths(json)

引数

  • json — JSON カラム。 JSON

返される値

JSON カラム内の共有データ構造に保存されているパスの配列を返します。 Array(String)

使用例

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

導入: v24.8

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

構文

JSONSharedDataPathsWithTypes(json)

引数

  • json — JSON カラム。 JSON

返される値

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

使用例

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'}                        │
└──────────────────────────────────────┴─────────────────────────────────────┘

JSONType

導入: v20.1

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

構文

JSONType(json[, indices_or_keys, ...])

引数

  • json — 解析する JSON 文字列 String
  • json[, indices_or_keys, ...] — ゼロ以上の引数のリスト。各引数は文字列または整数であることができます。 String または (U)Int8/16/32/64

返される値

JSON 値の型の文字列として返します。それ以外の場合、値が存在しない場合は Null=0 を返します。 Enum

使用例

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';
1
1
1

JSON_EXISTS

導入: v21.8

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

構文

JSON_EXISTS(json, path)

引数

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

返される値

値が JSON ドキュメント内に存在する場合は 1 が返されます。それ以外の場合は 0 を返します。 UInt8

使用例

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_EXISTS(⋯ '$.hello')─┐
│                        1 │
└──────────────────────────┘
┌─JSON_EXISTS(⋯llo.world')─┐
│                        1 │
└──────────────────────────┘
┌─JSON_EXISTS(⋯.hello[*]')─┐
│                        1 │
└──────────────────────────┘
┌─JSON_EXISTS(⋯.hello[0]')─┐
│                        1 │
└──────────────────────────┘

JSON_QUERY

導入: v21.8

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

構文

JSON_QUERY(json, path)

引数

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

返される値

抽出した 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

導入: v21.11

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

返される値

抽出した 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 JSON_VALUE('{"hello":"world"}', '$.b') settings function_json_value_return_type_allow_nullable=true;
world
0
2
ᴺᵁᴸᴸ

dynamicElement

導入: v

指定した型のカラムを Dynamic カラムから抽出します。

構文

dynamicElement(dynamic, type_name)

引数

  • dynamic — Dynamic カラム - type_name — 抽出するバリアント型の名前

返される値

CREATE TABLE test (d Dynamic) ENGINE = Memory;
INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]);
SELECT d, dynamicType(d), dynamicElement(d, 'String'), dynamicElement(d, 'Int64'), dynamicElement(d, 'Array(Int64)'), dynamicElement(d, 'Date'), dynamicElement(d, 'Array(String)') FROM test;
┌─d─────────────┬─dynamicType(d)─┬─dynamicElement(d, 'String')─┬─dynamicElement(d, 'Int64')─┬─dynamicElement(d, 'Array(Int64)')─┬─dynamicElement(d, 'Date')─┬─dynamicElement(d, 'Array(String)')─┐
│ ᴺᵁᴸᴸ          │ None           │ ᴺᵁᴸᴸ                        │                       ᴺᵁᴸᴸ │ []                                │                      ᴺᵁᴸᴸ │ []                                 │
│ 42            │ Int64          │ ᴺᵁᴸᴸ                        │                         42 │ []                                │                      ᴺᵁᴸᴸ │ []                                 │
│ Hello, World! │ String         │ Hello, World!               │                       ᴺᵁᴸᴸ │ []                                │                      ᴺᵁᴸᴸ │ []                                 │
│ [1,2,3]       │ Array(Int64)   │ ᴺᵁᴸᴸ                        │                       ᴺᵁᴸᴸ │ [1,2,3]                           │                      ᴺᵁᴸᴸ │ []                                 │
└───────────────┴────────────────┴─────────────────────────────┴────────────────────────────┴───────────────────────────────────┴───────────────────────────┴────────────────────────────────────┘

dynamicType

導入: v

Dynamic カラムの各行のバリアント型名を返します。行に NULL が含まれている場合は、その行には 'None' が返されます。

構文

dynamicType(dynamic)

引数

  • dynamic — Dynamic カラム

返される値

CREATE TABLE test (d Dynamic) ENGINE = Memory;
INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]);
SELECT d, dynamicType(d) FROM test;
┌─d─────────────┬─dynamicType(d)─┐
│ ᴺᵁᴸᴸ          │ None           │
│ 42            │ Int64          │
│ Hello, World! │ String         │
│ [1,2,3]       │ Array(Int64)   │
└───────────────┴────────────────┘

isDynamicElementInSharedData

導入: v

サブカラムに分離されず、バイナリ形式で共有バリアントに格納されている Dynamic カラムの行に対して true を返します。

構文

isDynamicElementInSharedData(dynamic)

引数

  • dynamic — Dynamic カラム

返される値

CREATE TABLE test (d Dynamic(max_types=2)) ENGINE = Memory;
INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]);
SELECT d, isDynamicElementInSharedData(d) FROM test;
┌─d─────────────┬─isDynamicElementInSharedData(d)─┐
│ ᴺᵁᴸᴸ          │ false              │
│ 42            │ false              │
│ Hello, World! │ true               │
│ [1,2,3]       │ true               │
└───────────────┴────────────────────┘

isValidJSON

導入: v20.1

渡された文字列が有効な JSON であるかどうかを確認します。

構文

isValidJSON(json)

引数

  • json — 検証する JSON 文字列 String

返される値

文字列が有効な JSON の場合は 1 を返します。そうでない場合は 0 を返します。 UInt8

使用例

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

整数を使用して JSON 配列と JSON オブジェクトの両方にアクセスする

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

simpleJSONExtractBool

導入: v21.4

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

構文

simpleJSONExtractBool(json, field_name)

引数

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

返される値

フィールドの値が true の場合は 1 を返します。それ以外の場合は 0 を返します。この関数は以下のケースを含む(そしてそれだけでなく)で 0 を返します:

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

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

simpleJSONExtractFloat

導入バージョン: v21.4

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

構文

simpleJSONExtractFloat(json, field_name)

引数

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

返される値

フィールドが存在し、数字が含まれている場合は、そのフィールドから解析された数字を返します。そうでない場合は0を返します。 Float64

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

simpleJSONExtractInt

導入バージョン: v21.4

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

構文

simpleJSONExtractInt(json, field_name)

引数

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

返される値

フィールドが存在し、数字が含まれている場合は、そのフィールドから解析された数字を返します。そうでない場合は0を返します。 Int64

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

simpleJSONExtractRaw

導入バージョン: v21.4

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

構文

simpleJSONExtractRaw(json, field_name)

引数

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

返される値

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

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

導入バージョン: v21.4

field_nameという名前のフィールドの値から二重引用符付きのStringを解析します。

実装の詳細

現在、基本多言語面以外の形式\uXXXX\uYYYYにおけるコードポイントのサポートはありません(これらはUTF-8ではなくCESU-8に変換されます)。

構文

simpleJSONExtractString(json, field_name)

引数

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

返される値

フィールドの非エスケープ値を、セパレーターを含めて文字列として返します。フィールドが二重引用符付き文字列を含まない場合、または非エスケープに失敗した場合、またはフィールドが存在しない場合は空の文字列を返します。 String

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

☺

simpleJSONExtractUInt

導入バージョン: v21.4

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

構文

simpleJSONExtractUInt(json, field_name)

引数

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

返される値

フィールドが存在し、数字が含まれている場合は、そのフィールドから解析された数字を返します。そうでない場合は0を返します。 UInt64

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

simpleJSONHas

導入バージョン: v21.4

field_nameという名前のフィールドがあるかどうかを確認します。

構文

simpleJSONHas(json, field_name)

引数

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

返される値

フィールドが存在する場合は1、それ以外の場合は0を返します。 UInt8

使用例

CREATE TABLE jsons
(
    `json` String
)
ENGINE = MergeTree
ORDER BY tuple();

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

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

toJSONString

導入バージョン: v21.7

値をそのJSON表現にシリアライズします。さまざまなデータ型やネストされた構造に対応しています。 64ビットの整数またはそれ以上(UInt64Int128など)は、デフォルトで引用符で囲まれます。output_format_json_quote_64bit_integersがこの動作を制御します。 特別な値であるNaNinfnullに置き換えられます。これらを表示するにはoutput_format_json_quote_denormals設定を有効にします。 Enum値のシリアライズ時、関数はその名前を出力します。

参照:

構文

toJSONString(value)

引数

  • value — シリアライズされる値。値は任意のデータ型であることができます。 Any

返される値

値のJSON表現を返します。 String

マップのシリアライズ

SELECT toJSONString(map('key1', 1, 'key2', 2));
┌─toJSONString(map('key1', 1, 'key2', 2))─┐
│ {"key1":1,"key2":2}                     │
└─────────────────────────────────────────┘

特別な値

SELECT toJSONString(tuple(1.25, NULL, NaN, +inf, -inf, [])) SETTINGS output_format_json_quote_denormals = 1;
┌─toJSONString(tuple(1.25, NULL, NaN, plus(inf), minus(inf), []))─┐
│ [1.25,null,"nan","inf","-inf",[]]                               │
└─────────────────────────────────────────────────────────────────┘

variantElement

導入バージョン: v

指定された型のカラムをVariantカラムから抽出します。

構文

variantElement(variant, type_name, [, default_value])

引数

  • variant — Variantカラム - type_name — 抽出するバリアント型の名前 - default_value — 指定された型のバリアントを持たない場合に使用されるデフォルト値。任意の型。オプション

返される値

CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory;
INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]);
SELECT v, variantElement(v, 'String'), variantElement(v, 'UInt64'), variantElement(v, 'Array(UInt64)') FROM test;
┌─v─────────────┬─variantElement(v, 'String')─┬─variantElement(v, 'UInt64')─┬─variantElement(v, 'Array(UInt64)')─┐
│ ᴺᵁᴸᴸ          │ ᴺᵁᴸᴸ                        │                        ᴺᵁᴸᴸ │ []                                 │
│ 42            │ ᴺᵁᴸᴸ                        │                          42 │ []                                 │
│ Hello, World! │ Hello, World!               │                        ᴺᵁᴸᴸ │ []                                 │
│ [1,2,3]       │ ᴺᵁᴸᴸ                        │                        ᴺᵁᴸᴸ │ [1,2,3]                            │
└───────────────┴─────────────────────────────┴─────────────────────────────┴────────────────────────────────────┘

variantType

導入バージョン: v

Variantカラムの各行のバリアント型名を返します。行がNULLを含む場合は、その行に対して'None'を返します。

構文

variantType(variant)

引数

  • variant — Variantカラム

返される値

CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory;
INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]);
SELECT variantType(v) FROM test;
┌─variantType(v)─┐
│ None           │
│ UInt64         │
│ String         │
│ Array(UInt64)  │
└────────────────┘