簡體   English   中英

從 MySQL 中的 JSON 對象中提取密鑰對值

[英]Extract key-pair values from JSON objects in MySQL

從 MySQL JSON 數據字段中,我從數組中提取數據,如下所示:

SELECT 
data ->> '$.fields[*]' as fields 
FROM some_database...

返回:

[{
"id": 111056, 
"hint": null, 
"slug": "email", 
"label": "E-mail", 
"value": null, 
"field_value": "test@example.com", 
"placeholder": null
}, {
"id": 111057, 
"hint": null, 
"slug": "name", 
"label": "Imię", 
"value": null, 
"field_value": "Aneta", 
"placeholder": null
}]

我還可以提取單列:

SELECT 
data ->> '$.fields[*].field_value' as fields 
FROM some_database...

並返回以下結果:

[test@example.com, Aneta]

但是如何將field_value label提取為密鑰對?

首選 output 將是包含對的單個多行字符串:

label: field_value
label: field_value
...

使用上面顯示的示例,它會讓我關注 output:

E-mail: test@example.com
Imię: Aneta

首選單線,因為我有多個這樣的 arrays 可以從各個領域中提取。

這是將鍵名提取為行的示例:

select j.keyname from some_database 
cross join json_table(
  json_keys(data->'$[0]'), 
  '$[*]' columns (
    keyname varchar(20) path '$'
  )
) as j;

Output:

+-------------+
| keyname     |
+-------------+
| id          |
| hint        |
| slug        |
| label       |
| value       |
| field_value |
| placeholder |
+-------------+

現在您可以將其加入值:

select n.n, j.keyname,
  json_unquote(json_extract(f.data, concat('$[', n.n, ']."', j.keyname, '"'))) as value
from some_database as d
cross join json_table(
  json_keys(d.data->'$[0]'),
  '$[*]' columns (
    keyname varchar(20) path '$'
  )
) as j
cross join n
join some_database as f on n.n < json_length(f.data);

Output:

+---+-------------+------------------+
| n | keyname     | value            |
+---+-------------+------------------+
| 0 | id          | 111056           |
| 0 | hint        | null             |
| 0 | slug        | email            |
| 0 | label       | E-mail           |
| 0 | value       | null             |
| 0 | field_value | test@example.com |
| 0 | placeholder | null             |
| 1 | id          | 111057           |
| 1 | hint        | null             |
| 1 | slug        | name             |
| 1 | label       | Imię             |
| 1 | value       | null             |
| 1 | field_value | Aneta            |
| 1 | placeholder | null             |
+---+-------------+------------------+

我正在使用一個只填充整數的實用程序表n

create table n (n int primary key);
insert into n values (0),(1),(2),(3)...;

如果這看起來像很多復雜的工作,那么當您希望 SQL 表達式在 Z0ECD11C1D7A287401D148A23BBD7 文檔中的離散字段上工作時,可能的教訓是在 JSON 中存儲數據並不容易。

您可以使用JSON_VALUE

select JSON_VALUE (json_value_col, '$.selected_key') 作為來自 user_details 的 selected_value;

您還可以使用JSON_EXTRACT

select JSON_EXTRACT (json_value_col, '$.selected_key') 作為來自 user_details 的 selected_value;

有關詳細信息,請參閱: https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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