mysql 如何在myslq中删除json_array中的项

wkftcu5l  于 2022-11-28  发布在  Mysql
关注(0)|答案(1)|浏览(297)

我有一个问题:我使用了json_remove和json_search,但它对mysql 8.0中的json_search结果不起作用

**数据库:**books数据表。

|public_unit_ids|
'[5630, 5631]'

查询:

select  
replace(json_search(REGEXP_REPLACE(public_unit_ids, '(5630|5631)', '""'), 'all', ''), '"', '') as new_js_replace,
json_remove(public_unit_ids, replace(json_search(REGEXP_REPLACE(public_unit_ids, '(5630|5631)', '""'), 'one', ''), '"', '')) as new_js_remove from books

结果:

| 新建js搜索|新建js删除|
| - -|- -|
| [[0],[1]]|“【5631,5632】”|

**预期:**删除5630和5631

| 新建js搜索|新建js删除|
| - -|- -|
| [[0],[1]]|【5632】|

c9x0cxw0

c9x0cxw01#

一个问题是JSON_SEARCH()只能搜索字符串,而不能搜索整数(请参见https://bugs.mysql.com/bug.php?id=90085)。
这里有另一个解决方案。
给定一个示例JSON数组:

mysql> set @j = '[5630, 5631, 5632]';

JSON_TABLE()函数将数组元素Map到行:

mysql> select j.* from json_table(@j, '$[*]' columns (n int path '$')) as j;
+------+
| n    |
+------+
| 5630 |
| 5631 |
| 5632 |
+------+

现在,您可以使用常规的WHERE子句来筛选这些行。

mysql> select j.* from json_table(@j, '$[*]' columns (n int path '$')) as j where j.n not in (5630,5631);
+------+
| n    |
+------+
| 5632 |
+------+

可以将结果重新聚合到一个JSON数组中,参数为JSON_ARRAYAGG()

mysql> select json_arrayagg(j.n) as new_j from json_table(@j, '$[*]' columns (n int path '$')) as j where j.n not in (5630,5631); 
+--------+
| new_j  |
+--------+
| [5632] |
+--------+

我将其显示为多个步骤只是为了解释它是如何工作的。您不需要执行所有步骤,只需要执行最后一个步骤。

相关问题