簡體   English   中英

如何提取 json 鍵和值作為具有 2 列的表 mysql 5.7

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM