MySql-使用JSON_REMOVE和JSON_SEARCH删除Json数组数值类型的元素

#查询属性值是否挂在sku

SELECT * FROM co_sku WHERE JSON_CONTAINS(common_attributes, CONCAT(SELECT id from co_attribute_value WHERE value = '10' and attribute_id = 7)) and code = '20515';

#删除sku关联属性值

update co_sku cs join co_attribute_value cav join co_attribute ca on cav.attribute_id = ca.id set cs.update_time=now(), cs.common_attributes = JSON_REMOVE(cs.common_attributes, JSON_UNQUOTE(JSON_SEARCH( REPLACE(REPLACE(REPLACE(JSON_EXTRACT(common_attributes, '$[*]'), ', ', '","'), '[', '["'), ']', '"]'), 'one', cav.id))) where ca.code = 'keywords' and cav.value = '压取器' and cs.code = '61605';

common_attributes=[80, 242, 24, 2, 4]

解决思路:

第一步:使用JSON_REMOVE把属性id从co_sku的common_attributes(json数组)里删除。

第二步:因为JSON_REMOVE需要根据元素路径去查,所以使用JSON_SEARCH找到属性id在common_attributes的路径path

第三步:使用JSON_EXTRACT查出common_attributes所有的数组元素

第四步:因为JSON_SEARCH里搜索的数组中的元素需要用双引号括起来,而co_sku的common_attributes中数组的元素并没有,因此需要REPLACE将取出来的数组加上双引号。

第五步:因为JSON_REMOVE中的路径不能是双引号,而JSON_SEARCH查出来的路径是有双引号的,因此需要使用JSON_UNQUOTE去除路径中的双引号。

第六步:又因为common_attributes中数组中的元素有可能重复,因此使用JSON_SEARCH的时候,使用one 匹配到第一条就返回,以防返回多条路径。

方法介绍:

1.JSON_EXTRACT:想要查询出来json中某个字段的值

JSON_EXTRACT(json_doc, path[, path] …)

2.REPLACE:替换

SELECT REPLACE('www.mysql.com', 'w', 'Ww');

-> 'WwWwWw.mysql.com'

3.JSON_SEARCH:指定JSON搜索路径

JSON_SEARCH(json_doc,one_or_all,search_str [,escape_char [,path] ...])

json_doc:要查询的json数据源,列

one_or_all:可选值 one 或者 all ,one 表示匹配到第一条就返回,all表示返回当期匹配到的所有路径,数组

search_str :查询的字符串

4.JSON_UNQUOTE:去双引号

mysql> SET @j = '"abc"';

mysql> SELECT @j, JSON_UNQUOTE(@j);

| "abc" | abc |

由于json储存的键值是带双引号,查询的字段结果也是带双引号。JSON_UNQUOTE() 函数的作用是去掉引号的功能。或者也可以使用REPLACE ()做替换

5.JSON_REMOVE:对一个key或多个key从个json记录中去掉

mysql> SET @j = '["a", ["b", "c"], "d"]';

mysql> SELECT JSON_REMOVE(@j, '$[1]');

["a", "d"]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值