ClickHouse/docs/ja/sql-reference/functions/json-functions.md
2020-10-13 20:23:29 +03:00

298 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
machine_translated: true
machine_translated_rev: 72537a2d527c63c07aa5d2361a8829f3895cf2bd
toc_priority: 56
toc_title: "JSON\u3067\u306E\u4F5C\u696D"
---
# JSONを操作するための関数 {#functions-for-working-with-json}
Yandexので。Metrica、JSONで送信したユーザーとしてセッションパラメータ。 このJSONを操作するための特別な関数がいくつかあります。 ほとんどの場合、Jsonはさらに前処理され、結果の値は処理された形式で別々の列に入れられます。これらの関数はすべて、JSONが何であるかについての強い前提に基づいていますが、できるだけ少なくして仕事を終わらせようとします。
以下の仮定が行われます:
1. フィールド名(関数の引数)は定数でなければなりません。
2. フィールド名は何らかの形でjsonでエンコードされます。 例えば: `visitParamHas('{"abc":"def"}', 'abc') = 1` でも `visitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0`
3. フィールドは、任意の入れ子レベルで無差別に検索されます。 複数の一致するフィールドがある場合は、最初の出現が使用されます。
4. JSONには文字列リテラルの外側に空白文字はありません。
## visitParamHas(パラムス、名前) {#visitparamhasparams-name}
があるかどうかをチェックします。 name 名前
## ビジットパラメクストラクチュイント(params,name) {#visitparamextractuintparams-name}
名前のフィールドの値からUInt64を解析します name. これが文字列フィールドの場合、文字列の先頭から数値を解析しようとします。 フィールドが存在しない場合、または存在するが数値が含まれていない場合は、0を返します。
## ビジットパラメクストラクチント(params,name) {#visitparamextractintparams-name}
Int64と同じです。
## パラメーター) {#visitparamextractfloatparams-name}
Float64と同じです。
## ビジットパラメクストラクトブール(params,name) {#visitparamextractboolparams-name}
真/偽の値を解析します。 結果はUInt8です。
## ビジットパラメクストラクトロー(params,name) {#visitparamextractrawparams-name}
区切り文字を含むフィールドの値を返します。
例:
``` sql
visitParamExtractRaw('{"abc":"\\n\\u0000"}', 'abc') = '"\\n\\u0000"'
visitParamExtractRaw('{"abc":{"def":[1,2,3]}}', 'abc') = '{"def":[1,2,3]}'
```
## パラメーターを指定します) {#visitparamextractstringparams-name}
二重引用符で文字列を解析します。 値はエスケープされていません。 エスケープ解除に失敗した場合は、空の文字列を返します。
例:
``` sql
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](https://github.com/lemire/simdjson) より複雑なJSON解析要件用に設計されています。 上記の仮定2はまだ適用されます。
## isValidJSON(json) {#isvalidjsonjson}
渡された文字列が有効なjsonであることを確認します。
例:
``` sql
SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1
SELECT isValidJSON('not a json') = 0
```
## JSONHas(json\[, indices_or_keys\]…) {#jsonhasjson-indices-or-keys}
値がJSONドキュメントに存在する場合, `1` 返されます。
値が存在しない場合, `0` 返されます。
例:
``` sql
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オブジェクトの両方にアクセスできます。
例えば:
``` sql
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\]…) {#jsonlengthjson-indices-or-keys}
JSON配列またはJSONオブジェクトの長さを返します。
値が存在しない場合、または型が間違っている場合, `0` 返されます。
例:
``` sql
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\]…) {#jsontypejson-indices-or-keys}
JSON値の型を返します。
値が存在しない場合, `Null` 返されます。
例:
``` sql
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\]…) {#jsonextractuintjson-indices-or-keys}
## JSONExtractInt(json\[, indices_or_keys\]…) {#jsonextractintjson-indices-or-keys}
## JSONExtractFloat(json\[, indices_or_keys\]…) {#jsonextractfloatjson-indices-or-keys}
## JSONExtractBool(json\[, indices_or_keys\]…) {#jsonextractbooljson-indices-or-keys}
JSONを解析して値を抽出します。 これらの機能と類似 `visitParam` 機能。
値が存在しない場合、または型が間違っている場合, `0` 返されます。
例:
``` sql
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\]…) {#jsonextractstringjson-indices-or-keys}
JSONを解析して文字列を抽出します。 この関数は次のようになります `visitParamExtractString` 機能。
値が存在しないか、型が間違っている場合は、空の文字列が返されます。
値はエスケープされていません。 エスケープ解除に失敗した場合は、空の文字列を返します。
例:
``` sql
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) {#jsonextractjson-indices-or-keys-return-type}
JSONを解析し、指定されたClickHouseデータ型の値を抽出します。
これは以前のものの一般化です `JSONExtract<type>` 機能。
つまり
`JSONExtract(..., 'String')` とまったく同じを返します `JSONExtractString()`,
`JSONExtract(..., 'Float64')` とまったく同じを返します `JSONExtractFloat()`.
例:
``` sql
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) {#jsonextractkeysandvaluesjson-indices-or-keys-value-type}
値が指定されたClickHouseデータ型であるJSONからキーと値のペアを解析します。
例:
``` sql
SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)]
```
## JSONExtractRaw(json\[, indices_or_keys\]…) {#jsonextractrawjson-indices-or-keys}
JSONの一部を解析されていない文字列として返します。
パーツが存在しないか、型が間違っている場合は、空の文字列が返されます。
例:
``` sql
SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]'
```
## JSONExtractArrayRaw(json\[, indices_or_keys…\]) {#jsonextractarrayrawjson-indices-or-keys}
JSON配列の要素を持つ配列を返します。
パーツが存在しないか配列でない場合は、空の配列が返されます。
例:
``` sql
SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') = ['-100', '200.0', '"hello"']'
```
## JSONExtractKeysAndValuesRaw {#json-extract-keys-and-values-raw}
JSONオブジェクトから生データを抽出します。
**構文**
``` sql
JSONExtractKeysAndValuesRaw(json[, p, a, t, h])
```
**パラメータ**
- `json` — [文字列](../data-types/string.md) 有効な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 [文字列](../data-types/string.md) キーまたはキーでフィールドを取得するには [整数](../data-types/int-uint.md) N番目のフィールドを取得するには1からインデックス付けされ、負の整数は最後から数えます。 設定されていない場合、JSON全体がトップレベルのオブジェクトとして解析されます。 任意パラメータ。
**戻り値**
- との配列 `('key', 'value')` タプル 両方のタプルメンバーは文字列です。
- 要求されたオブジェクトが存在しない場合、または入力JSONが無効な場合は空の配列。
タイプ: [配列](../data-types/array.md)([タプル](../data-types/tuple.md)([文字列](../data-types/string.md), [文字列](../data-types/string.md)).
**例**
クエリ:
``` sql
SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}')
```
結果:
``` text
┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}')─┐
│ [('a','[-100,200]'),('b','{"c":{"d":"hello","f":"world"}}')] │
└──────────────────────────────────────────────────────────────────────────────────────────────┘
```
クエリ:
``` sql
SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b')
```
結果:
``` text
┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b')─┐
│ [('c','{"d":"hello","f":"world"}')] │
└───────────────────────────────────────────────────────────────────────────────────────────────────┘
```
クエリ:
``` sql
SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c')
```
結果:
``` text
┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c')─┐
│ [('d','"hello"'),('f','"world"')] │
└───────────────────────────────────────────────────────────────────────────────────────────────────────┘
```
[元の記事](https://clickhouse.tech/docs/en/query_language/functions/json_functions/) <!--hide-->