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

MySQL在更新期间将JSON对象解释为字符串

  •  2
  • Julian  · 技术社区  · 8 年前

    我有一个JSON类型的可空列:

    CREATE TABLE mytable (mycolumn JSON);
    

    我要做的是跟踪数组中的事件,并将每个事件保持为数组中对象的形式。所需的内容 mycolumn 在将三个事件推入阵列后,将是:

    [
      {"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"]},
      {"product": ["book"], "subgenre": ["space"], "genre": ["fiction"]},
      {"product": ["book"], "genre": ["romance"]},
    ] 
    

    物体的形状是不相关和未知的(以上只是例子)。唯一已知的是,每个事件都是一个 至少 一处房产。该属性是数组、对象、标量、字符串还是null是未知的。

    该列最初将为空,并且我的测试显示我需要将它合并到一个数组中,否则推入它将失败。

    我最接近这项工作的是:

    UPDATE
      mytable
    SET
      mycolumn = JSON_ARRAY_APPEND (
        COALESCE (mycolumn, '[]'),
        '$',
        (
          '{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}'
        )
      );
    

    SELECT mycolumn FROM mytable;
    
    [
        "{\"product\":[\"book\"],\"subgenre\":[\"scifi\"],\"genre\":[\"fiction\"]}",
        "{\"product\":[\"book\"],\"subgenre\":[\"space\"],\"genre\":[\"fiction\"]}",
        "{\"product\":[\"book\"],\"genre\":[\"romance\"]}"
    ]
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   spencer7593    8 年前

    在我看来你想用 JSON_MERGE_PRESERVE JSON_ARRAY_APPEND 功能。

    后者将第三个参数评估为 价值

    在 UPDATE 语句显示,围绕第三个伪参数(to JSON\数组\附加 )没有意义。第三个论点只是一个例子 . 这个值是一个长字符串,看起来像JSON,但是在这个上下文中,它只是一个 .

    参考文献: https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html#function_json-array-append


    SELECT 声明。一旦有了返回预期/期望结果的表达式,就可以将表达式移动到 更新 声明。

        2
  •  -1
  •   jmsinusa    7 年前
    cast('{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}' as json)
    

    MySQL append json object to array of json objects