メインコンテンツへスキップ
メインコンテンツへスキップ

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_ARRAY_LENGTH

引数

  • 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[, indices_or_keys, ...], return_type)

引数

  • json — 解析する JSON 文字列。String
  • indices_or_keys — 0 個以上の引数からなるリストで、それぞれは文字列または整数を指定できます。String または (U)Int*
  • return_type — 返す ClickHouse のデータ型。String

戻り値

可能であれば指定された 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 — 0 個以上の引数からなるリストで、それぞれは文字列または整数とすることができます。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 — 0 個以上の引数からなるリストで、各要素は文字列または整数のいずれかです。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 — 0 個以上の引数からなるリストで、それぞれは文字列または整数です。String または (U)Int*

戻り値

存在する場合は浮動小数点値を返し、存在しない場合は 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*

戻り値

抽出された浮動小数点数の値を返します。見つからない場合、または変換できない場合は 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 — 0 個以上の引数からなるリストで、それぞれは文字列または整数とすることができます。String または (U)Int*

戻り値

値が存在する場合は整数値を返し、存在しない場合は 0 を返します。Int64

使用例

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

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 — 0 個以上の引数からなるリストで、各引数は文字列または整数を指定可能。String または (U)Int*

返り値

JSON オブジェクトのキーを要素とする配列を返します。Array(String)

使用例

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

JSONExtractKeysAndValues

導入バージョン: v20.1

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

構文

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

引数

  • json — 解析する JSON 文字列。String
  • indices_or_keys — 0 個以上の引数からなるリストで、それぞれの要素は文字列または整数です。String または (U)Int*
  • value_type — 値の ClickHouse データ型。String

戻り値

解析されたキーと値のペアからなるタプルの配列を返します。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 — 0 個以上の引数からなるリストで、それぞれは文字列または整数です。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 — 各要素が文字列または整数になり得る 0 個以上の引数のリスト。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

object

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

JSONExtractString

導入バージョン: v20.1

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

構文

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

引数

  • json — 解析する JSON 文字列。String
  • indices_or_keys — 0 個以上の引数からなるリストで、それぞれは文字列または整数値のいずれか。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 — 0 個以上の引数からなるリストで、各引数は文字列または整数を指定できます。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, ...] — 0 個以上の引数からなるリスト。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, ...] — 省略可能。0 個以上の引数のリスト。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, ...])

別名: jsonMergePatch

引数

  • json1[, json2, ...] — 1 つ以上の有効な JSON 文字列。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, ...] — 0 個以上の引数のリストで、それぞれは文字列または整数です。String または (U)Int8/16/32/64

戻り値

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

使用例

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

この関数の挙動は次の設定で制御されます。

  • SET function_json_value_return_type_allow_nullable = true の場合、NULL が返されます。値が複合型(struct、array、map など)の場合、デフォルトでは空文字列が返されます。
  • SET function_json_value_return_type_allow_complex = true の場合、複合値が返されます。

構文

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

導入バージョン: v24.1

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

この関数は、Dynamic カラムから特定の型の値を抽出します。行に要求された型の値が 含まれている場合は、その値を返します。行に別の型または NULL が含まれている場合は、スカラー型に対しては NULL を、 配列型に対しては空の配列を返します。

構文

dynamicElement(dynamic, type_name)

引数

  • dynamic — 抽出元の Dynamic カラム。Dynamic
  • type_name — 抽出するバリアント型の名前 (例: 'String', 'Int64', 'Array(Int64)')。

戻り値

指定された型に対応する値を Dynamic カラムから返します。一致しない型の場合は NULL を返し、配列型の場合は空配列を返します。Any

Dynamic カラムから異なる型を抽出する

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

導入バージョン: v24.1

Dynamic カラムの各行に対して、そのバリアントの型名を返します。

NULL を含む行では、関数は 'None' を返します。それ以外の行では、Dynamic カラムのその行に格納されている実際のデータ型(例: 'Int64'、'String'、'Array(Int64)')を返します。

構文

dynamicType(dynamic)

引数

  • dynamic — 検査する動的カラム。Dynamic

戻り値

各行に格納されている値の型名を返します。NULL 値の場合は 'None' を返します。String

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

導入バージョン: v24.1

Dynamic カラムのうち、個別のサブカラムとしてではなく共有のバリアント形式で保存されている行に対して true を返します。

Dynamic カラムに max_types 制限が設定されている場合、この制限を超えた値は、個別の型付きサブカラムに分割される代わりに、共有のバイナリ形式で保存されます。この関数は、どの行がこの共有形式で保存されているかを判別します。

構文

isDynamicElementInSharedData(dynamic)

引数

  • dynamic — 確認する Dynamic カラム。Dynamic

戻り値

値が shared variant 形式で保存されている場合は true を返し、個別のサブカラムとして保存されている場合、または NULL の場合は false を返します。Bool

max_types 制限付きの 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)

エイリアス: visitParamExtractBool

引数

  • 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)

エイリアス: visitParamExtractFloat

引数

  • 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)

別名: visitParamExtractInt

引数

  • 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)

別名: visitParamExtractRaw

引数

  • 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)

別名: visitParamExtractString

引数

  • 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)

エイリアス: visitParamExtractUInt

引数

  • 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)

別名: visitParamHas

引数

  • 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-bit の整数以上(UInt64Int128 など)は、デフォルトでは引用符で囲まれます。output_format_json_quote_64bit_integers によってこの動作を制御できます。 特別な値 NaN および infnull に置き換えられます。output_format_json_quote_denormals 設定を有効にすると、それらを表示できます。 Enum の値をシリアライズする場合、この関数はその名前を出力します。

関連項目:

構文

toJSONString(value)

引数

  • value — シリアル化する値。任意のデータ型の値を指定できます。Any

戻り値

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

Map のシリアル化

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",[]]                               │
└─────────────────────────────────────────────────────────────────┘