JSON_SET

更新时间:
复制 MD 格式

JSON_SET函数用于替换JSON文件指定位置的值或新增对应的值。

命令格式

JSON JSON_SET(JSON <input>, ARRAY STRING <path>, JSON <value>, BOOLEAN <create_if_missing>);

-- 标准示例。
-- 返回[{"f1":4,"f2":null},2,null,3]。
SELECT JSON_SET(JSON'[{"f1":1,"f2":null}, 2, null, 3]',
  ARRAY("0", "f1"), 
  JSON'4', 
  false);

参数说明

  • input:必填。被替换的JSON内容。支持JSON OBJECT或JSON ARRAY。

  • path:必填。被替换的JSON内容的位置。ARRAY<STRING>类型。ARRAY里的每一个值对应为JSON的一层嵌套定位路径值,如果JSON是n层嵌套内容,那么ARRAY数组对应为n个值。如果JSON对象没有嵌套,则第一个值为“0”。

  • value:必填。待替换的JSON值。

  • create_if_missing:必填。当指定位置的值不存在时,是否将待替换的JSON值添加到input中。BOOLEAN类型,true表示添加,false表示不添加。

返回值

修改后的JSON。

使用示例

  • 示例1:替换JSON指定位置的值。

    -- 返回 [{"f1":[2,3,4],"f2":null},2,null,3]。
    SELECT JSON_SET(JSON'[{"f1":1,"f2":null},2,null,3]',
      ARRAY("0","f1"), 
      JSON'[2,3,4]', 
      false);
     
    -- JSON嵌套2层数组的情况。 
    -- 返回 [{"f1":1,"f2":null},2,3,[4,6]]。
    SELECT JSON_SET(JSON'[{"f1":1,"f2":null},2,3,[4,5]]',
      ARRAY("3","1"), 
      JSON'6', 
      false);               
  • 示例2:替换JSON指定位置的值。create_if_missing参数为false,当指定位置的值不存在时,不会执行替换或新增操作。

    -- 返回 [{"f1":1,"f2":null},2,null,3]。
    SELECT JSON_SET(JSON'[{"f1":1,"f2":null},2,null,3]', 
      ARRAY("0","f3"), 
      JSON'[2,3,4]', 
      false);
  • 示例3:替换JSON指定位置的值。create_if_missing参数为true,当指定位置的值不存在时,会将待替换的JSON内容添加到input中。

    -- 返回 [{"f1":1,"f2":null,"f3":[2,3,4]},2,null,3]。
    SELECT JSON_SET(JSON'[{"f1":1,"f2":null},2,null,3]', 
      ARRAY("0","f3"), 
      JSON'[2,3,4]', 
      true);
  • 示例4:如果输入参数为JSON OBJECT,需要保证路径path第一个元素为合法Key。

    -- 返回 {"f1":[2,3,4]}
    
    SELECT JSON_SET(JSON'{"f1":1}', 
     ARRAY("f1"), 
     JSON'[2,3,4]', 
     false);
    
    
    -- 返回{"f1":1}
    
    -- 由于JSON非数组,此时路径["0"]代表key为字符串"0"的字段,路径不存在不进行替换
    
    SELECT JSON_SET(JSON'{"f1":1}', 
     ARRAY("0"), 
     JSON'[2,3,4]', 
     false);
    说明

    若使用MaxCompute客户端执行,当use_instance_tunnel为true时,可能出现 odpscmd与logview的两边返回结果的屏显不一致的情况,结果请以logview里的result为准。

相关函数

JSON_SET函数属于JSON函数,更多JSON类型函数请参见JSON函数概述。