JSON 関数の種類
JSON を解析するための関数は 2 つのセットがあります:
simpleJSON (visitParam) 関数
ClickHouse には、簡略化された JSON を扱うための特別な関数があります。これらの JSON 関数は、JSON の内容に関する強い仮定に基づいています。彼らは、できるだけ少ない作業でできるだけ早くタスクを完了しようとします。
以下の仮定がなされます:
- フィールド名(関数引数)は定数でなければなりません。
- フィールド名は JSON 内で何らかの形で標準的にエンコードされています。たとえば:
simpleJSONHas('{"abc":"def"}', 'abc') = 1
ですが、 simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0
です。
- フィールドは任意のネストレベルで無差別に検索されます。一致するフィールドが複数ある場合は、最初の出現が使用されます。
- JSON には文字列リテラルの外に空白文字が存在しません。
これらの関数は simdjson に基づいており、より複雑な JSON 解析要件に対応するように設計されています。
これらの関数は、JSON オブジェクトから値を抽出する際に ASCII の大文字と小文字を区別しないキー一致を行います。
それは、ケースセンシティブな対応物と同様に機能しますが、オブジェクトのキーはケースを無視して一致します。
大文字と小文字が異なる複数のキーが一致する場合、最初の一致が返されます。
注記
これらの関数は、大文字と小文字を区別する対応物よりもパフォーマンスが劣る可能性があるため、可能であれば通常の JSONExtract 関数を使用してください。
JSONAllPaths
導入: v24.8
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 カラム内のすべてのパスとそのデータ型のマップを返します。 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
を返します。
構文
引数
json
— 有効な JSON を含む文字列。 String
返される値
json
が有効な JSON 配列文字列である場合、その配列要素の数を返します。そうでない場合は NULL
を返します。 Nullable(UInt64)
例
使用例
SELECT
JSONArrayLength(''),
JSONArrayLength('[1,2,3]');
┌─JSONArrayLength('')─┬─JSONArrayLength('[1,2,3]')─┐
│ ᴺᵁᴸᴸ │ 3 │
└─────────────────────┴────────────────────────────┘
JSONDynamicPaths
導入: v24.8
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 カラム内の動的パスとそのデータ型のマップを返します。 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))'} │
└──────────────────────────────────────┴─────────────────────────────────┘
導入: 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]) │
└──────────────────────────────────┘
導入: 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"'] │
└──────────────────────────────┘
導入: 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')
導入: 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;
導入: 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')
導入: 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')
array_type
SELECT JSONExtractCaseInsensitive('{"List": [1, 2, 3]}', 'list', 'Array(Int32)')
導入: 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;
導入: 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')
導入: 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;
導入: 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')
ネストされた
SELECT JSONExtractIntCaseInsensitive('{"DATA": {"COUNT": 42}}', 'data', 'Count')
導入: 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')]
導入: 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}')
ネストされた
SELECT JSONExtractKeysCaseInsensitive('{"User": {"name": "John", "AGE": 25}}', 'user')
導入: 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] │
└──────────────────┘
導入: 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')
導入: 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 │
└───────┘
導入: v25.8
JSON を解析し、ケースインセンシティブなキー一致を使用して文字列を抽出します。この関数は JSONExtractString
に類似しています。
構文
JSONExtractStringCaseInsensitive(json [, indices_or_keys]...)
引数
json
— 解析する JSON 文字列 String
indices_or_keys
— 省略可能。フィールドに移動するためのインデックスまたはキー。キーはケースインセンシティブな一致を使用します String
または (U)Int*
返される値
抽出された文字列値を返します。見つからない場合は空の文字列を返します。 String
例
基本
SELECT JSONExtractStringCaseInsensitive('{"ABC": "def"}', 'abc')
ネストされた
SELECT JSONExtractStringCaseInsensitive('{"User": {"Name": "John"}}', 'user', 'name')
導入: 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;
導入: 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')
JSONHas
導入: v20.1
提供された値が JSON ドキュメント内に存在するかどうかを確認します。
構文
JSONHas(json[ ,indices_or_keys, ...])
引数
返される値
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;
JSONLength
導入: v20.1
JSON 配列または JSON オブジェクトの長さを返します。
値が存在しない場合や型が間違っている場合は 0
が返されます。
構文
JSONLength(json [, indices_or_keys, ...])
引数
返される値
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;
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 カラム内の共有データ構造に保存されているパスの配列を返します。 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 カラム内の共有データ構造に保存されているパスとそのデータ型のマップを返します。 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 値の型の文字列として返します。それ以外の場合、値が存在しない場合は 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';
JSON_EXISTS
導入: v21.8
値が JSON ドキュメント内に存在する場合は 1
が返されます。
値が存在しない場合は 0
が返されます。
構文
引数
返される値
値が 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 配列または 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_nullable
を true
に設定することにより、 NULL
が返されます。値が複雑な型(構造体、配列、マップなど)の場合、デフォルトで空の文字列が返されます。
function_json_value_return_type_allow_complex
を true
に設定することにより、複雑な値が返されます。
構文
引数
返される値
抽出した 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;
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' が返されます。
構文
引数
返される値
例
例
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)
引数
返される値
例
例
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 であるかどうかを確認します。
構文
引数
返される値
文字列が有効な JSON の場合は 1
を返します。そうでない場合は 0
を返します。 UInt8
例
使用例
SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1;
SELECT isValidJSON('not JSON') = 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);
導入: v21.4
field_name
という名前のフィールドの値から true/false の値を解析します。
結果は UInt8
です。
構文
simpleJSONExtractBool(json, field_name)
引数
返される値
フィールドの値が 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;
導入バージョン: v21.4
field_name
という名前のフィールドの値からFloat64
を解析します。
field_name
が文字列フィールドの場合、文字列の先頭から数字の解析を試みます。
フィールドが存在しない場合、または存在するが数字を含まない場合は、0
を返します。
構文
simpleJSONExtractFloat(json, field_name)
引数
返される値
フィールドが存在し、数字が含まれている場合は、そのフィールドから解析された数字を返します。そうでない場合は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;
導入バージョン: v21.4
field_name
という名前のフィールドの値からInt64
を解析します。
field_name
が文字列フィールドの場合、文字列の先頭から数字の解析を試みます。
フィールドが存在しない場合、または存在するが数字を含まない場合は、0
を返します。
構文
simpleJSONExtractInt(json, field_name)
引数
返される値
フィールドが存在し、数字が含まれている場合は、そのフィールドから解析された数字を返します。そうでない場合は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;
導入バージョン: v21.4
field_name
という名前のフィールドの値をString
として、セパレーターを含めて返します。
構文
simpleJSONExtractRaw(json, field_name)
引数
返される値
フィールドが存在する場合は、そのフィールドの値をセパレーターを含めて文字列として返します。そうでない場合は空の文字列を返します。 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]}
導入バージョン: v21.4
field_name
という名前のフィールドの値から二重引用符付きのString
を解析します。
実装の詳細
現在、基本多言語面以外の形式\uXXXX\uYYYY
におけるコードポイントのサポートはありません(これらはUTF-8ではなくCESU-8に変換されます)。
構文
simpleJSONExtractString(json, field_name)
引数
返される値
フィールドの非エスケープ値を、セパレーターを含めて文字列として返します。フィールドが二重引用符付き文字列を含まない場合、または非エスケープに失敗した場合、またはフィールドが存在しない場合は空の文字列を返します。 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;
導入バージョン: v21.4
field_name
という名前のフィールドの値からUInt64
を解析します。
field_name
が文字列フィールドの場合、文字列の先頭から数字の解析を試みます。
フィールドが存在しない場合、または存在するが数字を含まない場合は、0
を返します。
構文
simpleJSONExtractUInt(json, field_name)
引数
返される値
フィールドが存在し、数字が含まれている場合は、そのフィールドから解析された数字を返します。そうでない場合は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;
simpleJSONHas
導入バージョン: v21.4
field_name
という名前のフィールドがあるかどうかを確認します。
構文
simpleJSONHas(json, field_name)
引数
返される値
フィールドが存在する場合は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;
toJSONString
導入バージョン: v21.7
値をそのJSON表現にシリアライズします。さまざまなデータ型やネストされた構造に対応しています。
64ビットの整数またはそれ以上(UInt64
やInt128
など)は、デフォルトで引用符で囲まれます。output_format_json_quote_64bit_integersがこの動作を制御します。
特別な値であるNaN
とinf
はnull
に置き換えられます。これらを表示するにはoutput_format_json_quote_denormals設定を有効にします。
Enum値のシリアライズ時、関数はその名前を出力します。
参照:
構文
引数
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'を返します。
構文
引数
返される値
例
例
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) │
└────────────────┘