在使用下面的SQL代码创建视图时遇到问题。
为property_changed和property_values创建的列默认设置为最外层的连接的大小。
当稍后在代码中使用这些列时,这就成了一个问题,因为我需要这些列是current-string + 50个字符。
CREATE OR REPLACE VIEW \`my_view\` AS
select *,
CONCAT('[', GROUP_CONCAT(CONCAT('"', table.property_name, '"')), ']') AS property_changed,
CONCAT('[',
GROUP_CONCAT(JSON_OBJECT('old_value', old_value, 'new_value', new_value)),
']'
) AS property_values
from table_log table
group by id, p_o_id, p_o_v, date_created, name, e_name我尝试过以所有不同的方式使用MySQL强制转换,但代码每次都失败。这里是否有什么东西阻止我使用CAST(....作为VARCHAR(300)?
或者有没有其他我还没有意识到的实现这一点的方法?
发布于 2020-10-16 15:46:22
您的代码使其看起来像是在尝试生成JSON数组。如果是这样,并且假设您运行的是MySQL 5.7.22或更高版本,请不要使用字符串连接函数: MySQL为此提供了JSON_ARRAYAGG()。
这更简单、更高效、更安全(例如,如果您的一些值包含嵌入的双引号,则MySQL将为您处理转义)。
select id, p_o_id, p_o_v, date_created, name, e_name,
JSON_ARRAYAGG(property_name) AS property_changed,
JSON_ARRAYAGG(JSON_OBJECT('old_value', old_value, 'new_value', new_value)) AS property_values
from table_log table
group by id, p_o_id, p_o_v, date_created, name, e_name这将生成JSON数据类型的列,而不是字符串-在这里似乎更相关。
https://stackoverflow.com/questions/64384725
复制相似问题