2016-11-30 152 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) –