MySQL
JSON型から値を抽出する
サーチ…
前書き
MySQL 5.7.8以降は、ネイティブJSONタイプをサポートしています。 jsonオブジェクトを作成するさまざまな方法がありますが、さまざまな方法でメンバーにアクセスしたり読むことができます。
主な機能はJSON_EXTRACT
、 ->
および->>
演算子はよりフレンドリーです。
構文
- JSON_EXTRACT(json_doc、path [、...])
- JSON_EXTRACT(json_doc、path)
- JSON_EXTRACT(json_doc、path1、path2)
パラメーター
パラメータ | 説明 |
---|---|
json_doc | 有効なJSON文書 |
パス | メンバーパス |
備考
MySQL 5.7リファレンスマニュアルで言及されている
- パス引数による複数の一致した値
それらの引数が複数の値を返す可能性がある場合、一致した値は、それらを生成したパスに対応する順序で配列としてオートラップされます。それ以外の場合、戻り値は単一の一致した値です。
-
NULL
結果:- argemuntはNULLです
- 一致しないパス
いずれかの引数がNULLであるか、パスがドキュメント内の値を見つけることができない場合は、NULLを返します。
JSON配列の値を読み込む
@myjson変数をJSON型として作成する(続きを読む ):
SET @myjson = CAST('["A","B",{"id":1,"label":"C"}]' as JSON) ;
メンバーをSELECT
ください!
SELECT
JSON_EXTRACT( @myjson , '$[1]' ) ,
JSON_EXTRACT( @myjson , '$[*].label') ,
JSON_EXTRACT( @myjson , '$[1].*' ) ,
JSON_EXTRACT( @myjson , '$[2].*')
;
-- result values:
'\"B\"', '[\"C\"]', NULL, '[1, \"C\"]'
-- visually:
"B", ["C"], NULL, [1, "C"]
JSON抽出演算子
抽出path
によって->
又は->>
演算子、つつ->>
引用符で囲まれていない値です。
SELECT
myjson_col->>'$[1]' , myjson_col->'$[1]' ,
myjson_col->>'$[*].label' ,
myjson_col->>'$[1].*' ,
myjson_col->>'$[2].*'
FROM tablename ;
-- visuall:
B, "B" , ["C"], NULL, [1, "C"]
--^^^ ^^^
だからcol->>path
はJSON_UNQUOTE(JSON_EXTRACT(col,path))
と等しくなりJSON_UNQUOTE(JSON_EXTRACT(col,path))
:
- >と同様に、次の例に示すように、 - >>演算子は常にEXPLAINの出力に展開されます。
mysql> EXPLAIN SELECT c->>'$.name' AS name -> FROM jemp WHERE g > 2\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: jemp partitions: NULL type: range possible_keys: i key: i key_len: 5 ref: NULL rows: 2 filtered: 100.00 Extra: Using where 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from `jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2) 1 row in set (0.00 sec)
インラインパス抽出(+)について読む
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow