MySQL
Извлечение значений из типа JSON
Поиск…
Вступление
MySQL 5.7.8+ поддерживает собственный тип JSON. Хотя у вас есть разные способы создания json-объектов, вы можете просматривать и читать их по-разному.
Основной функцией является JSON_EXTRACT
, поэтому операторы ->
и ->>
более дружелюбны.
Синтаксис
- JSON_EXTRACT (json_doc, путь [...])
- JSON_EXTRACT (json_doc, путь)
- JSON_EXTRACT (json_doc, путь1, путь2)
параметры
параметр | Описание |
---|---|
json_doc | действительный документ JSON |
дорожка | путь участников |
замечания
Упоминается в MySQL 5.7 Справочное руководство
- Несколько согласованных значений по аргументам пути
Если возможно, что эти аргументы могут возвращать несколько значений, сопоставленные значения автоматически переносятся в виде массива в порядке, соответствующем путям, которые их создавали. В противном случае возвращаемое значение будет единственным согласованным значением.
-
NULL
Результат, когда:- любой аргумент - NULL
- путь не соответствует
Возвращает NULL, если любой аргумент равен NULL, или нет путей для определения значения в документе.
Чтение значения JSON Array
Создайте переменную @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
помощью ->
или ->>
Операторы, а ->>
значение UNQUOTED:
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))
:
Как и в случае ->, оператор - >> всегда выводится в вывод 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)
Читайте о выводе строки inline (+)