有没有简单的方法在mysql中制作json数据?

时间:2016-11-02 20:31:20

标签: sql json mariadb

我有一个记录表,以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

1 个答案:

答案 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)