2016-11-30 155 views
2

我正在探索新的mysql服务器的JSON函数。但遇到一个非常基本的问题。mysql JSON_SET无法插入到具有NULL值的列(5.7+)

当我不知道当前值是否为NULL时,如何将{“key”:“value”}插入到JSON列中?

表仅用于说明:

CREATE TABLE `testjson` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `extra` JSON NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

用NULL和有效的JSON值的测试数据。

| id | extra    | 
| -: | -     | 
| 1 | (NULL)   | 
| 2 | {"name": "james"} | 

期望的结果:

| id | extra      | 
| -: | -       | 
| 1 | {"age": 87}     | 
| 2 | {"age": 87, "name": "james"} | 

现在,我尝试添加{ “时代”:87}到所有行:

UPDATE testjson 
    SET extra = JSON_SET(extra,'$.age', 87) 
; 

UPDATE testjson 
    SET extra = JSON_MERGE(extra,JSON_OBJECT('age', 87)), 
; 

上面没有更新NULL字段。试图设置列默认为{},但它是不允许的。

因为NULL不是有效的JSON数据,没有MySQL的JSON funcion作品: https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

我目前的解决办法是插入前设置为NULL {},但它是愚蠢的。一个简单的更新不应该使用两个查询。

你们如何处理这个问题?

+0

检查,如果你有一个NULL值(控制流功能),如果是使用的是_create_ JSON的功能之一...? https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html – CBroe

+1

Try:'UPDATE \'testjson \'SET \'extra \'= IF(\'extra \'IS NULL,JSON_OBJECT('​​age',87),JSON_INSERT(\'extra \','$ .age',87));'。 – wchiquito

回答

5

使用COALESCE

UPDATE testjson SET extra = JSON_SET(COALESCE(extra, '{}'), '$.age', 87);

+0

非常好!谢谢! – Reed

+0

只是一个警告,我遇到了这样一个事实:我的字段不是以mysql方式'null',而是JSON方式'null',即字段内容是字符串“null”,因此COALESCE没有为我工作箱子。 –

+0

后续行动:我发现没有别的方法比......'SET extra = JSON_SET(IF(JSON_TYPE(extra)='NULL',“{}”,extra),“$ .age”,87)'(适合你样品ofc) –