簡體   English   中英

根據存儲為長文本的 json 中的特定值提取密鑰

[英]Extract key based on specifc value from json stored as longtext

我有一列存儲用戶屬性的值。 列類型是長文本。

例如,

{"1":1,"15607":1,"1345":2}

我只想提取值為 1 的鍵,這意味着我應該得到 1 和 15607。

我嘗試使用 json_search

json_search(cast(attribute_value AS JSON as json), 'all', 1)

但這不返回任何數據。

使用 json_search 或者甚至不使用 json 和僅使用 sql 是否可行?

這是一個演示,顯示了獲得所需內容的步驟:

mysql> set @att = '{"1":1,"15607":1,"1345":2}';

mysql> select json_keys(@att);
+------------------------+
| json_keys(@att)        |
+------------------------+
| ["1", "1345", "15607"] |
+------------------------+

mysql> select j.* from json_table(json_keys(@att), '$[*]' columns (k int path '$')) as j;
+-------+
| k     |
+-------+
|     1 |
|  1345 |
| 15607 |
+-------+

mysql> select j.k, att.v 
  from json_table(json_keys(@att), '$[*]' columns (k int path '$')) as j 
  cross join (select cast(@att as json) as v) as att;
+-------+---------------------------------+
| k     | v                               |
+-------+---------------------------------+
|     1 | {"1": 1, "1345": 2, "15607": 1} |
|  1345 | {"1": 1, "1345": 2, "15607": 1} |
| 15607 | {"1": 1, "1345": 2, "15607": 1} |
+-------+---------------------------------+

mysql> select j.k, json_extract(att.v, concat('$."',j.k,'"')) as v 
  from json_table(json_keys(@att), '$[*]' columns (k int path '$')) as j 
  cross join (select cast(@att as json) as v) as att;
+-------+------+
| k     | v    |
+-------+------+
|     1 | 1    |
|  1345 | 2    |
| 15607 | 1    |
+-------+------+

mysql> select k, v from (
  select j.k, json_extract(att.v, concat('$."',j.k,'"')) as v 
    from json_table(json_keys(@att), '$[*]' columns (k int path '$')) as j 
    cross join (select cast(@att as json) as v) as att) as t 
where v = 1;
+-------+------+
| k     | v    |
+-------+------+
|     1 | 1    |
| 15607 | 1    |
+-------+------+

如果這看起來工作量很大,那確實是。 在 MySQL 中使用 JSON 很少是個好主意。 它使查詢變得更加復雜、更難編寫和更難優化。

我建議盡可能避免在 MySQL 中使用 JSON。 使用正常的行和列。

暫無
暫無

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

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