2016-11-30 22 views
2

新しいmysqlサーバのJSON機能を調べています。しかし、非常に初歩的な問題に遭遇する。mysql JSON_SETはNULL値(5.7+)のカラムに挿入できません

現在の値がNULLかどうかわからないときは、どのように{"key": "value"}をJSON列に挿入しますか? NULLと有効なJSON値

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

試験データ:

テーブルは、単に例示のためのものです。

| 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に設定することですが、それは愚かです。単純な更新では、2つのクエリを使用するべきではありません。

どうやってこれを処理しますか?

+0

チェック...? https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html – CBroe

+1

試してみてください: 'UPDATE \' testjson \ 'SET \' extra \ '= IF(\' extra \ 'IS NULL、JSON_OBJECT( 'age'、87)、JSON_INSERT(\ 'extra \'、 '$ .age'、87)); '。 – wchiquito

答えて

5

使用COALESCE:そうJSONを_create_関数のいずれかを使用する場合は、NULL値(制御フロー機能)を持って、そして場合

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

+0

非常に良い!ありがとう! – Reed

+0

私はフィールドがmysql-wayでは 'null'ではなく、JSON-wayで' null'であるという事実に遭遇しました。つまり、フィールドの内容は文字通り '' null ''でした。したがって、COALESCEは私のために箱から出てきなさい。 –

+0

フォローアップ:私は他の方法は見つけられませんでした。 "SET extra = JSON_SET(IF(JSON_TYPE(extra)= 'NULL'、" {} "、extra)、" $ .age "、87)'サンプルのc) –

関連する問題