我有一个记录表,以json格式记录更改的字段。 现在,我们将每个版本的数据拉出来并进行差异并将其保存在应用程序中。但它会提取大量数据,因此可以提高OOM,所以我想在db端进行。
我可以通过自联接更改记录,但我不知道在json中更改数据。
有没有办法生成json字符串?
以下是架构。
create table A { id int not null primary key auto_increment,
code int not null,
version int not null,
name varcher(10) not null,
content varcahr(10) not null ) ;
create table logging ( id int not null primary key auto_increment,
version int not null,
code int not null,
changed varcher(1024) );
INSERT INTO logging ( version, code , changed )
SELECT A2.version, A2.code, ? <- I don't know how create json
FROM A A1 inner join A A2 ON A1.code = A2.code
WHERE A1.version = 1 AND A2.version = 2
AND ( A1.name != A2.name OR A1.content != A2.content )
我想在下面制作一个json {“name”:“UPDATED”}如果仅更改名称 {“name”:“UPDATED”,“content”:“UPDATED_CONTENT”}如果姓名&amp;内容已更改。
我正在使用MariaDB 10.0.22
答案 0 :(得分:0)
不确定我是否完全理解所需的输出(因为帖子上没有样本数据和样本输出)。
另外,我认为没有MySQL命令将数据转换为JSON。 您可以在应用程序端执行此操作,这可能更容易,或者您可以使用字符串连接在查询中构建它(通常这不是最佳实践!如果您的JSON语法非常简单和简短,可能没问题。)
将JSON字符串存储在数据库中也不是最佳做法 - 如果您有表logging
,为什么需要表A
?
INSERT INTO logging ( VERSION, CODE , CHANGED )
SELECT A2.version, A2.code,
IF(A1.content = A2.content,
-- no content change
CONCAT("{\"name\":\"", A2.name, "\"}"),
-- content was also changed
CONCAT("{\"name\":\"", A2.name, "\", \"content\": \"", A2.content, "\"}")) AS json_description
FROM A A1 INNER JOIN A A2 ON A1.code = A2.code
WHERE A1.version = 1 AND A2.version = 2
AND (A1.name != A2.name OR A1.content != A2.content)