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