3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MySQL CONCATでNULLがあると結合できない

Last updated at Posted at 2021-12-01

前置き

仕事である特定の文言をあるカラムに追加してほしいと言われ、
大量にデータがあったため、UPDATE文でアップデートすることに。

そのカラムには既に文言が入っている場合もあり、文言が入っていた場合は活かしてほしいとのことだったので、
CONCATを使って文字を結合することで対応をしました。

CONCATの使い方

UPDATE テーブル名 SET カラム名 = CONCAT('追加する文言' , カラム名) WHERE id = 1;

※CONCAT()内のカラム名は既に入っている文言を引っ張ることができます。

このSQLでテーブルは下記のように更新されます。

|id|カラム名|
|:|:|
|1|'追加する文言''元々入っている文言'|


分かりやすく説明すると、
例えば、ある人がランチで食べたメニューのデータベースがあるとします。

|日付|メニュー|
|:|:|
|11/15|ラーメン|
|11/18|ラーメン|
|11/19|ラーメン|
|11/24|ラーメン|

やっぱり何のラーメンか付けておけばよかった~という時、
下記のようにCONCATを使えば、何のラーメンだったか追加することが出来ます。

UPDATE ランチメニュー SET メニュー = CONCAT('醤油' , メニュー) WHERE 日付 = '11/15';
UPDATE ランチメニュー SET メニュー = CONCAT('二郎系' , メニュー) WHERE 日付 = '11/18';
UPDATE ランチメニュー SET メニュー = CONCAT('塩' , メニュー) WHERE 日付 = '11/19';
UPDATE ランチメニュー SET メニュー = CONCAT('家系' , メニュー) WHERE 日付 = '11/24';

|日付|メニュー|
|:|:|
|11/15|醤油ラーメン|
|11/18|二郎系ラーメン|
|11/19|塩ラーメン|
|11/24|家系ラーメン|

二郎系の翌日はさっぱりとした塩に限りますね。。

カラムがNULLだった場合は…?

話は戻りますが、
今回、私はUPDATEしたいカラムがNULLだった場合を考慮せずUPDATEかけたところ、
NULLだったカラムには追加する文言が入るどころか、NULLのままになってました。

CONCATは引数のどちらかにNULLが入っていた場合はNULLを返すようです。

やっちまったぜ


そんな時はCOALESCE を使ってNULLを空文字に変換すれば文字の結合が可能です!

COALESCEの使い方

UPDATE テーブル名 SET カラム名 = CONCAT('追加する文言' , COALESCE(カラム名, '')) WHERE id = 1;

これでカラムがNULLの場合は、空文字を返し文字を結合するため、追加したい文言だけ追加される形となります。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?