【问题标题】:How to remove multiple values FROM MySQL JSON如何从 MySQL JSON 中删除多个值
【发布时间】:2019-04-18 10:40:55
【问题描述】:

我需要从 MySQL 中的 JSON 数组中删除多个值

我已经在每个值上尝试了 JSON_REMOVE 和 JSON_SEARCH,但是在删除元素后 INDEX 发生了变化

JSON 数组:

["1", "5", "18", "68"]

例如:去掉“5”和“68”

预期结果:

["1", "18"]

已编辑:

我尝试过的代码:

JSON_REMOVE(`can_see`, JSON_UNQUOTE(JSON_SEARCH(`can_see`, 'one', '5')), JSON_UNQUOTE(JSON_SEARCH(`can_see`, 'one', '68')))

查询结果:

["1", "18", "68"]

在索引 $[0] 处删除“5”后,“68”索引更改为 $[2],但 JSON_SEARCH 从原始 json 返回 $[3]

我也试过嵌套:

JSON_REMOVE(JSON_REMOVE(`can_see`, JSON_UNQUOTE(JSON_SEARCH(`can_see`, 'one', '5'))), JSON_UNQUOTE(JSON_SEARCH(JSON_REMOVE(`can_see`, JSON_UNQUOTE(JSON_SEARCH(`can_see`, 'one', '5'))), 'one', '68')))

这可行,但如果我想删除超过 2 个值,它会变得混乱

【问题讨论】:

  • 你能告诉我们你尝试了什么吗?这将有助于为您的问题提供背景信息。 INDEX 有什么变化?
  • 愚蠢的答案当然是先做 68 和 5 秒然后索引就不是问题了
  • @RiggsFolly 我需要确保数组已排序
  • “我需要确保数组已排序” 我发布了一个答案,这有帮助吗?

标签: mysql json


【解决方案1】:

我需要确保数组已排序

不是最容易理解的方式,但我认为您必须使用 SQL 数字生成器将 json 数组解析为标记(记录),您可以更轻松地过滤和排序。

查询

SELECT 
  JSON_ARRAYAGG(
     JSON_EXTRACT(records.json, CONCAT('$[', number_generator.number , ']'))
  ) AS json                                    
FROM (

  SELECT 
   @row := @row + 1 AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION   SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION  SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2
  CROSS JOIN (
    SELECT @row := -1 
  ) init_user_params 
) AS number_generator
CROSS JOIN (


SELECT 
    json
  , JSON_LENGTH(records.json) AS json_array_length    
FROM (

  SELECT 
   '["1", "5", "18", "68"]' AS json
  FROM 
   DUAL  
) AS records

) AS records 
WHERE
    number BETWEEN 0 AND  json_array_length - 1   
  AND
    JSON_EXTRACT(records.json, CONCAT('$[', number_generator.number , ']')) NOT IN(5, 68)                   
ORDER BY 
 REPLACE(JSON_EXTRACT(records.json, CONCAT('$[', number_generator.number , ']')), '"', '')                       

结果

| json        |
| ----------- |
| ["1", "18"] |

demo

另一方面,MySQL 8+ 使它更容易

查询

SELECT 
 JSON_ARRAYAGG (
    result_table.item
 ) AS json
FROM JSON_TABLE(
     '["1", "5", "18", "68"]'
   , "$[*]"

   COLUMNS (
       rowid FOR ORDINALITY
     , item VARCHAR(100) PATH "$"   
   )
) AS result_table
WHERE
 CAST(result_table.item AS UNSIGNED) NOT IN(5, 68) 
ORDER BY 
 CAST(result_table.item AS UNSIGNED) ASC

结果

| json        |
| ----------- |
| ["1", "18"] |

demo

【讨论】:

  • 非常感谢您的回答,老实说,这对我来说有点理解和操纵我的目的。这是一个更大的 UPDATE 查询的一部分,它设置了多个列 MySQL 版本是 5.6
  • 是的,问题是在 MySQL 5.6 中制作 JSON 解析器要困难得多,我建议您升级 MySQL 版本。因为 MySQL 5.6 没有那么多 JSON 支持。 @Double_O_Seven
猜你喜欢
  • 2014-05-29
  • 2021-04-07
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多