#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 обрабатывается как двоичная строка (которая определяется клиентом) и, следовательно, печатается в шестнадцатеричном формате, а не в извлеченном значении.