【问题标题】:Using JSON_ARRAY_APPEND to insert large array into JSON document使用 JSON_ARRAY_APPEND 将大数组插入 JSON 文档
【发布时间】:2021-09-29 22:12:04
【问题描述】:

我正在使用JSON_ARRAY_APPEND 更新表中现有条目中的数组对象。

我是通过代码来做的,查询如下:

UPDATE table t1
        SET t1.value = JSON_ARRAY_APPEND('[]', '$', JSON_OBJECT('desc', '${desc}', 
        'hosts', '[${hosts}]'))
        WHERE  t1.key = '${key1}
    

我生成的value 如下所示:

[{"desc": "this is desc", "hosts": "[host1,host2, host3]"}] 

value 的期望输出是:

[{"desc": "this is desc", "hosts": ["host1","host2","host3"]"}] 

【问题讨论】:

    标签: mysql arrays json sql-update mysql-json


    【解决方案1】:

    ``

    SELECT CONCAT('"', REPLACE('${hosts}', ',', '","'), '"');
    UPDATE table t1
    SET t1.value = JSON_ARRAY_APPEND('[]', '$', JSON_OBJECT('desc', '${desc}', 'hosts', '[${hosts}]'))
    WHERE  t1.key = '${key1};
    
    
    SET @host =  'host1,host2, host3';
    UPDATE table t1
    SET t1.value = JSON_ARRAY(
    JSON_OBJECT(
    'desc', 'this is desc', 
    'hosts',
    JSON_ARRAY(                           
    SUBSTRING_INDEX(@host, ',', 1),
    SUBSTRING_INDEX(SUBSTRING_INDEX(@host, ',', 2), ',', -1) ,
    SUBSTRING_INDEX(SUBSTRING_INDEX(@host, ',', 3), ',', -1)))) ;
    

    ''

    【讨论】:

    • 有没有办法,我可以在JSON_ARRAY_APPEND 内做到这一点,而无需使用额外的SELECT CONCAT 语句?
    • 一种将已转义的数据传递给 $ {hosts} 的方法。
    【解决方案2】:

    您不需要使用 JSON_ARRAY_APPEND(),因为您正在创建一个新数组。

    使用JSON_ARRAY()。这确保了数组将被格式化为有效的 JSON。您应该尽量避免编写通过连接逗号、方括号和引号来形成 JSON 的代码,因为很难确保这将始终生成有效的 JSON 格式。这是脆弱的代码。

    另外,使用查询参数而不是尝试将代码变量插入到您的 SQL 语句中。

    UPDATE table t1
    SET t1.value = JSON_ARRAY( 
      JSON_OBJECT(
        'desc', ?, 
        'hosts', JSON_ARRAY(?, ?, ?, ?))
    WHERE t1.key = ?
    

    您需要一个 ? 参数标记,用于您希望在 hosts 数组中的每个主机。

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 1970-01-01
      • 2020-04-06
      • 2017-09-14
      • 2021-12-13
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多