[英]how to extract json keys and values as table with 2 columns mysql 5.7
在名為“test”的表上使用 varchar 數據類型將其放在名為“value”的列中:
'{“3”:“3”,“2”:“7”,“6”:“1”,“1”:“2”,“5”:“5”}'
output 我需要:
col1 col2
3 3
2 7
6 1
1 2
5 5
我在解析 json 時遇到了困難,因為似乎只有版本 8 提供了正確使用 json 的能力。
也許有一些想法如何解決它並動態提取鍵和值而無需在 col1 和 col2 中對鍵進行硬編碼:
select 1 as 'col1', TRIM(BOTH '"' FROM (JSON_EXTRACT(value, '$."1"'))) 'col2'
from test
union all
select 2, TRIM(BOTH '"' FROM (JSON_EXTRACT(value, '$."2"')))
from test
union all
select 3, TRIM(BOTH '"' FROM (JSON_EXTRACT(value, '$."3"')))
from test
union all
select 5, TRIM(BOTH '"' FROM (JSON_EXTRACT(value, '$."5"')))
from test
union all
select 6, TRIM(BOTH '"' FROM (JSON_EXTRACT(value, '$."6"')))
from test
最好升級到 MySQL 8,這樣您就可以使用 JSON_TABLE() function。
如果您需要在 SQL 表達式中引用單個元素,最好避免將數據存儲在 JSON 中,而是將數據存儲為普通行和列。 無論您是否升級到 MySQL 8,都是如此。
但這是您問題的解決方案:
您可以將 JSON 文檔的鍵作為數組獲取:
mysql> create table test ( value json);
mysql> insert into test set value = '{"3": "3", "2": "7", "6": "1", "1": "2", "5": "5"}';
mysql> select json_keys(value) as `keys` from test;
+---------------------------+
| keys |
+---------------------------+
| ["1", "2", "3", "5", "6"] |
+---------------------------+
pivot 這個數組成行的最簡單方法是有一個整數表。
mysql> create table numbers (n int primary key);
mysql> insert into numbers (n) values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
mysql> select json_extract(json_keys(value), concat('$[', n, ']')) as `key`
from test cross join numbers where n <= 4;
+------+
| key |
+------+
| "1" |
| "2" |
| "3" |
| "5" |
| "6" |
+------+
現在,您可以使用此結果對您開始使用的文檔進行自連接,並提取密鑰。
mysql> select json_unquote(k.`key`) as col1,
json_unquote(json_extract(test.value, concat('$.', k.`key`))) as col2
from (
select json_extract(json_keys(value), concat('$[', n, ']')) as `key` from test cross join numbers where n <= 4
) as k
cross join test;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 2 | 7 |
| 3 | 3 |
| 5 | 5 |
| 6 | 1 |
+------+------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.