json_set更新动态字段的数组

触发器中的13行Trans显示为字符串,怎么能把11行的值传给13行,现在不论用Trans;“Trans”都是存成了字符串“Trans”,我要把值传给json的位置’$.’定位字符,用$=Trans也不行,Trans的值动态从Type中获取,应该是(20g或者40g之类的Type字段里的值)

img

img

引用chatGPT作答,要将触发器中第11行的动态字段的值传递给第13行,以使用json_set更新数组,可以采用以下方法:

1.使用SET语句将第11行中动态字段的值存储到一个变量中,例如:

SET @trans = NEW.Type;

2.在json_set语句中使用该变量更新数组,例如:

SET @json = json_set(@json, '$[0].Trans', @trans);

在此示例中,变量@trans的值用于更新数组的第一个元素中的Trans字段。

请注意,json_set语句的确切语法可能取决于您的具体用例和JSON对象的结构。此外,您可能需要调整json_set语句中的索引以匹配要更新的数组元素的位置。

ChatGTP,有答案

该回答引用chatgpt:
可以使用MySQL中的JSON_SET函数更新JSON类型的字段。假设你有一个包含动态字段数组的JSON字段名为json_col,其中每个动态字段有一个属性名Trans。你还有一个包含动态字段属性值Type的表table_name。

以下是一个将Trans属性值设置为Type属性值的示例查询:

UPDATE table_name SET json_col = 
JSON_SET(json_col, 
    CONCAT('$[', 
        JSON_UNQUOTE(JSON_SEARCH(json_col, 'one', 'Trans', NULL, '$**.Trans')), 
        '].Trans'), 
    Type
) WHERE ...;


在此查询中,JSON_SEARCH函数用于查找包含Trans属性的JSON数组中的元素。JSON_UNQUOTE函数用于从结果中删除双引号。

然后使用CONCAT函数构建包含路径和属性名的字符串,JSON_SET函数用于在JSON对象中设置新的Trans属性值。

你需要将WHERE子句替换为你的特定条件。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据您的描述,您想在使用 json_set() 更新动态字段的数组触发器时,将变量 Trans 中的值传递给 JSON 中的位置 $. 定位字符。您也提到 Trans 的值是从 Type 字段中动态获取的。

在这种情况下,您可以使用字符串连接操作符 ||$.Trans 变量的值连接起来。具体方法如下:

CREATE TRIGGER trigger_name BEFORE UPDATE ON table_name FOR EACH ROW
BEGIN
    SET @json = JSON_SET(OLD.json_column, '$[0].$.field', NEW.value, '$[0].$.Trans', CONCAT('$.', NEW.Type));
    SET NEW.json_column = @json;
END;

在这个触发器中,CONCAT() 函数用于将字符串 $. 和变量 Trans 的值连接起来,形成一个 JSON 路径。JSON_SET() 函数将要更新的 JSON 路径设置为这个连接后的字符串,这样就可以将变量 Trans 中的值传递到指定的 JSON 位置中。

请注意,上述代码仅供参考。您需要将其适当修改,以符合您的实际需要和数据库架构。
如果我的回答解决了您的问题,请采纳!

concat连接最先想到,sql语句报错

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    抱歉,作为AI语言模型,我无法提供代码和具体的解决方案。建议您参考以下步骤来更新动态字段的数组:

    1. 使用json_extract获取存储在Type字段中的值。
    2. 将该值存储在一个变量中,并使用它作为数组索引。
    3. 使用json_set更新数组位置的值,将第11行的值设置为Trans位置对应索引的值。

    示例代码如下:

    -- 获取存储在Type字段中的值
    SET @type = json_extract(trigger_data, '$.Type');
    
    -- 将Type值用作数组索引更新Trans位置的值
    SET trigger_data = json_set(trigger_data, CONCAT('$[', @type, '].Trans'), value_to_update);
    

    其中,value_to_update表示需要更新的值。请替换为相应的值。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^