【问题标题】:How to use JSON_REMOVE with several rows from a subquery?如何将 JSON_REMOVE 与子查询中的多行一起使用?
【发布时间】:2021-08-27 13:54:15
【问题描述】:

我在data 列中有一个带有 json-column 的表,还有一个带有要从第一个表中删除的键的表。 MySQL 5.7。

id data
1 {"key1": "value1", "key2": "value2", "key10": "value10", "key100": "value100"}
20 {"key1": "value1", "key18": "value18", "key150": "value150"}
57 {"key5": "value5", "key10": "value10"}
id key value
1 key1 value1
18 key2 value2
30 key150 value150

我想从第二个表中删除所有带有键的元素。 我试过JSON_ARRAYAGG()JSON_REMOVE() 需要根据docs 的带有键的“路径[,路径]”结构。

UPDATE `table1` as `t1`
SET `t1`.`data` =  JSON_REMOVE(`t1`.`data`, (
    SELECT JSON_ARRAYAGG(`key`)
    FROM `table2` as `t2`
    )
);

我还没有从子查询行中找到关于 json 路径的示例或文档。 如何将返回的行中的行或数组值转换为正确的路径?

查询后我期望的结果:

id data
1 {"key10": "value10", "key100": "value100"}
20 {"key18": "value18"}
57 {"key5": "value5", "key10": "value10"}

【问题讨论】:

    标签: mysql mysql-json


    【解决方案1】:

    您可以准备要执行的查询。查询可以动态创建。

    在这种情况下,您需要创建此查询来更新表(我称之为json_stuff):

    UPDATE json_stuff
       SET jsons = JSON_REMOVE(jsons, '$.key1','$.key2','$.key150')
    

    可以使用以下方法动态创建并放入变量中:

    SELECT CONCAT("UPDATE json_stuff SET jsons = JSON_REMOVE(jsons, ",
                  GROUP_CONCAT(CONCAT('\'$.',keyname,'\'')),
                  ")")
      INTO @sql_delete_string
      FROM delete_stuff
    

    ..其中delete_stuff 是您的表,其中包含要删除的键。

    然后您可以通过call execute_immediate(@sql_delete_string) 使用此过程执行它:

    CREATE PROCEDURE execute_immediate(IN query MEDIUMTEXT)
        MODIFIES SQL DATA
        SQL SECURITY DEFINER
    BEGIN
        SET @q = query;
        PREPARE stmt FROM @q;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END;
    

    注意:此过程取自EXECUTE IMMEDIATE MySQL


    dbfiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      相关资源
      最近更新 更多