Извлечение значений из вложенного JSON в MySQL

#mysql #json

Вопрос:

Я хочу извлечь данные из вложенного JSON в MySQL, например:

 create table json_test (my_json json);
insert into json_test values ('{"outer_key": {"inner_key": "inner_value"} }');
mysql> select * from json_test;
 --------------------------------------------- 
| my_json                                     |
 --------------------------------------------- 
| {"outer_key": {"inner_key": "inner_value"}} |
 --------------------------------------------- 
 

Я могу успешно извлечь один слой в глубину с помощью:

 select my_json -> '$.outer_key' from json_test;
 

Но я не могу получить самую глубокую ценность от того, с чем я был знаком по Postgres:

 select my_json -> '$.outer_key' -> '$.inner_key' from json_test; -- syntax error
select my_json -> '$.outer_key' ->> '$.inner_key' from json_test; -- syntax error
 

Я придумал уродливый обходной путь с:

 mysql> with cte as (select my_json -> '$.outer_key' as cte_inner from json_test) select cte_inner -> '$.inner_key' from cte;
 ---------------------------- 
| cte_inner -> '$.inner_key' |
 ---------------------------- 
| "inner_value"              |
 ---------------------------- 
 

Но было интересно, есть ли более простое решение этой проблемы?

Ответ №1:

Вы можете указать полный путь следующим образом:

 select my_json->'$.outer_key.inner_key' from json_test;
-- "inner_value" (json)

select my_json->>'$.outer_key.inner_key' from json_test;
-- inner_value (string)
 

Комментарии:

1. — «inner_value» (json) Похоже, что это не JSON, а значение строкового типа. Смотрите fiddle — JSON обрабатывается как двоичная строка (которая определяется клиентом) и, следовательно, печатается в шестнадцатеричном формате, а не в извлеченном значении.