代码之家  ›  专栏  ›  技术社区  ›  Kar

更新Snowflake中ARRAY列中的一个键值

  •  1
  • Kar  · 技术社区  · 1 年前

    要求 更新所有键值之一为空的数组列

    表中的details_array如下所示

    DETAILS_ARRAY

    [
      {
        "dl_country": "",
        "typeid": "U"
      }
    ]
    

    尝试使用以下语句更新键值,但没有成功

    MERGE INTO tgt
    USING (
      SELECT a_id, d_id, dl_country
      FROM doc_fix
      WHERE a_id = 12321 AND d_id = 88899
    ) src 
    ON tgt.a_id = src.a_id AND tgt.d_id = src.d_id
    WHEN MATCHED THEN
      UPDATE SET 
      DETAILS_ARRAY = OBJECT_INSERT(tgt.DETAILS_ARRAY,'dl_country', src.dl_country)
    ;
    

    错误

    Invalid argument types for function 'OBJECT_INSERT': (ARRAY, VARCHAR(21), VARCHAR(16777216), BOOLEAN)
    

    上面是一个id的示例,但我需要更新dl_country字段中所有具有空字符串的id

    1 回复  |  直到 1 年前
        1
  •  1
  •   player0    1 年前

    尝试更新键值所在的所有行的数组列 dl_country 为空:

    UPDATE tgt
    SET DETAILS_ARRAY = NEW_DETAILS_ARRAY
    FROM (
      SELECT 
        a_id,
        d_id,
        ARRAY_AGG(
          CASE 
            WHEN json_data.value:dl_country::string = '' THEN OBJECT_INSERT(json_data.value, 'dl_country', src.dl_country)
            ELSE json_data.value
          END
        ) AS NEW_DETAILS_ARRAY
      FROM tgt,
      LATERAL FLATTEN(input => DETAILS_ARRAY) json_data,
      (
        SELECT a_id, d_id, dl_country
        FROM doc_fix
        WHERE dl_country = ''
      ) src
      WHERE tgt.a_id = src.a_id
      AND tgt.d_id = src.d_id
      GROUP BY a_id, d_id
    ) AS subquery
    WHERE tgt.a_id = subquery.a_id
    AND tgt.d_id = subquery.d_id;