Help wanted!
The following content of this documentation page has been machine-translated. But unlike other websites, it is not done on the fly. This translated text lives on GitHub repository alongside main ClickHouse codebase and waits for fellow native speakers to make it more human-readable. You can also use the original English version as a reference.
JSONを操作するための関数
Yandexので。Metrica、JSONで送信したユーザーとしてセッションパラメータ。 このJSONを操作するための特別な関数がいくつかあります。 (ほとんどの場合、Jsonはさらに前処理され、結果の値は処理された形式で別々の列に入れられます。)これらの関数はすべて、JSONが何であるかについての強い前提に基づいていますが、できるだけ少なくして仕事を終わらせようとします。
以下の仮定が行われます:
- フィールド名(関数の引数)は定数でなければなりません。
- フィールド名は何らかの形でjsonでエンコードされます。 例えば:
visitParamHas('{"abc":"def"}', 'abc') = 1
でもvisitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0
- フィールドは、任意の入れ子レベルで無差別に検索されます。 複数の一致するフィールドがある場合は、最初の出現が使用されます。
- JSONには文字列リテラルの外側に空白文字はありません。
visitParamHas(パラムス、名前)
があるかどうかをチェックします。 ‘name’ 名前
ビジットパラメクストラクチュイント(params,name)
名前のフィールドの値からUInt64を解析します ‘name’. これが文字列フィールドの場合、文字列の先頭から数値を解析しようとします。 フィールドが存在しない場合、または存在するが数値が含まれていない場合は、0を返します。
ビジットパラメクストラクチント(params,name)
Int64と同じです。
パラメーター)
Float64と同じです。
ビジットパラメクストラクトブール(params,name)
真/偽の値を解析します。 結果はUInt8です。
ビジットパラメクストラクトロー(params,name)
区切り文字を含むフィールドの値を返します。
例:
visitParamExtractRaw('{"abc":"\\n\\u0000"}', 'abc') = '"\\n\\u0000"'
visitParamExtractRaw('{"abc":{"def":[1,2,3]}}', 'abc') = '{"def":[1,2,3]}'
パラメーターを指定します)
二重引用符で文字列を解析します。 値はエスケープされていません。 エスケープ解除に失敗した場合は、空の文字列を返します。
例:
visitParamExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
visitParamExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
visitParamExtractString('{"abc":"\\u263"}', 'abc') = ''
visitParamExtractString('{"abc":"hello}', 'abc') = ''
現在、この形式のコードポイントはサポートされていません \uXXXX\uYYYY
それは基本的な多言語面からではありません(UTF-8の代わりにCESU-8に変換されます)。
以下の機能は、次のとおりです simdjson より複雑なJSON解析要件用に設計されています。 上記の仮定2はまだ適用されます。
isValidJSON(json)
渡された文字列が有効なjsonであることを確認します。
例:
SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1
SELECT isValidJSON('not a json') = 0
JSONHas(json[, indices_or_keys]…)
値がJSONドキュメントに存在する場合, 1
返されます。
値が存在しない場合, 0
返されます。
例:
SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1
SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0
indices_or_keys
ゼロ以上の引数のリストは、それぞれ文字列または整数のいずれかになります。
- String=キ
- 正の整数=最初からn番目のメンバー/キーにアクセスします。
- 負の整数=最後からn番目のメンバー/キーにアクセスします。
要素の最小インデックスは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[, indices_or_keys]…)
JSON配列またはJSONオブジェクトの長さを返します。
値が存在しない場合、または型が間違っている場合, 0
返されます。
例:
SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3
SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2
JSONType(json[, indices_or_keys]…)
JSON値の型を返します。
値が存在しない場合, Null
返されます。
例:
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[, indices_or_keys]…)
JSONExtractInt(json[, indices_or_keys]…)
JSONExtractFloat(json[, indices_or_keys]…)
JSONExtractBool(json[, indices_or_keys]…)
JSONを解析して値を抽出します。 これらの機能と類似 visitParam
機能。
値が存在しない場合、または型が間違っている場合, 0
返されます。
例:
SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 1) = -100
SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) = 200.0
SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) = 300
JSONExtractString(json[, indices_or_keys]…)
JSONを解析して文字列を抽出します。 この関数は次のようになります visitParamExtractString
機能。
値が存在しないか、型が間違っている場合は、空の文字列が返されます。
値はエスケープされていません。 エスケープ解除に失敗した場合は、空の文字列を返します。
例:
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[, indices_or_keys…], Return_type)
JSONを解析し、指定されたClickHouseデータ型の値を抽出します。
これは以前のものの一般化です JSONExtract<type>
機能。
つまり
JSONExtract(..., 'String')
とまったく同じを返します JSONExtractString()
,
JSONExtract(..., 'Float64')
とまったく同じを返します JSONExtractFloat()
.
例:
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": [-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(json[, indices_or_keys…], Value_type)
値が指定されたClickHouseデータ型であるJSONからキーと値のペアを解析します。
例:
SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)]
JSONExtractRaw(json[, indices_or_keys]…)
JSONの一部を解析されていない文字列として返します。
パーツが存在しないか、型が間違っている場合は、空の文字列が返されます。
例:
SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]'
JSONExtractArrayRaw(json[, indices_or_keys…])
JSON配列の要素を持つ配列を返します。
パーツが存在しないか配列でない場合は、空の配列が返されます。
例:
SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') = ['-100', '200.0', '"hello"']'
JSONExtractKeysAndValuesRaw
JSONオブジェクトから生データを抽出します。
構文
JSONExtractKeysAndValuesRaw(json[, p, a, t, h])
パラメータ
json
— 文字列 有効なJSONで。p, a, t, h
— Comma-separated indices or keys that specify the path to the inner field in a nested JSON object. Each argument can be either a 文字列 キーまたはキーでフィールドを取得するには 整数 N番目のフィールドを取得するには(1からインデックス付けされ、負の整数は最後から数えます)。 設定されていない場合、JSON全体がトップレベルのオブジェクトとして解析されます。 任意パラメータ。
戻り値
- との配列
('key', 'value')
タプル 両方のタプルメンバーは文字列です。 - 要求されたオブジェクトが存在しない場合、または入力JSONが無効な場合は空の配列。
例
クエリ:
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"')] │
└───────────────────────────────────────────────────────────────────────────────────────────────────────┘