DB 開発

MySQLで空文字(空白、ブランク)カラムを置換する

『空文字(空白、ブランク)を置換したい』

データベースを扱う際、あるカラムに値が入っていなかった場合に処理を行うというケースがある。
しかしMySQLの場合はこの何も入ってない場合の処理が少しややこしいので紹介したいと思う。


『何も入ってない』は2種類ある

『何も入ってない』は『何も入ってない』だろ、と思うかも知れないが、データベースの世界には以下の2種類の表現がある。

  • 空文字(ブランク)
  • NULL(ヌル)


空文字(ブランク)

空文字(ブランク)は "" という状態。
イメージとしては 何か入れる為に入れ物を用意したけど何も入ってない のイメージだろうか。


NULL(ヌル)

NULLはデータベース上でも NULL と表現される。
イメージは 入れ物を用意する前 という感じ。


空文字とNULLは同じではない

以下のSQLが示すように、空文字とNULLは同じではない。

SQL

select 
  (CASE WHEN ""=NULL THEN 1
   ELSE  0 END) as null_is_blank
from dual;

結果

null_is_blank
0

しかし同じではないのに !='' の場合は空文字とNULLが同じであるかのような挙動をする。

SELECT * FROM tbl_name WHERE str != '';
→空文字とNULL値が除外される
MySQLのNULL値と空文字の扱いについて - まいけるの日記

故に『何も入ってない場合』を処理する為には、どちらかをもう一方に置換する必要がある。


空文字(空白、ブランク)を置換する

ついに本題である空文字の置換であるが、ここでも少し問題がある。
Oracleであれば DECODE関数 に置換したい値と置換後の値を引数に設定すれば置換できるのだが、MySQLにDECODE関数は無い

そこで空文字カラムを何か別の値に置換するには2段階の処理を行う。

  • nullifで空文字カラムをNULLに置換
  • そしてifnullで目的の値に置換する
ifnull(nullif(置換したいカラム,''),'置換したい値')


まとめ

  • 『何も入ってない』は空文字とNULLの2種類あってそれぞれ意味が違う
  • MySQLにOracleのDECODE関数は無い
  • 空文字を置換したい場合は一度NULLに置換した後にさらに別の値に置換する方法をとる

ITipsと同じようなブログを作る方法

ブログに興味がありますか?

もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

ランキング参加中

にほんブログ村 IT技術ブログへ

他にもブログやSNSで紹介してくれると励みになります。

はてブのコメントで酷評されると泣きます(´;ω;`)

-DB, 開発

© 2024 ITips