ど素人から毛を生やす。<延>

[MySQL]空文字 or NULL を一息で判別したかった話

Web > Other 2018年8月21日(最終更新:3月前)

2018年8月21日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。
MySQL初心者です。

カラムAにデータが入っていたらAを、入っていなかったらBの内容を取得したかったのですが、
「入っていない状態」は空文字とNULLの2パターンが想定される。
DB構成としてアカンくないか、NULL許容させんなや、などとツッコミはありますが、古いDBに文句言っても仕方ない。

さて、NULLと空文字が別物だってのは、MySQL初心者でも常識です。

NULLは「IS NULL」で、空文字は「=''」で指定、
と思ったのですが、「!=''」でNULLと空文字の両方を除外できると小耳に挟みました。

え、なにゆえ??
じゃあ「!=''」を使おう、とするには、そうなる理由がわからなくて怖い。

そう思っていましたら、こちらのQiitaの記事にすごくわかりやすい解説コメントがついていまして。

要約すると、「!=''」のとき

'AAA' ⇒ TRUE
''    ⇒ FALSE
NULL  ⇒ NULL

まじか( ゚Д゚)
試しにSELECTのところで演算してみたところ、確かに上記の結果が出力されました。

NULLだとFALSEでなくNULLを返す、真偽に於いてNULLはFALSEと同じ結果になる、と。
勉強になった。

ちなみに「!=''」のほか「<>」でも同様の結果を確認しました。
MySQLライクなのは「<>」の方かな。


追記

SELECTでやるなら大抵の場合はIF()を使った方が良いことに気づいた。

IF(expr1,expr2,expr3)
expr1 が TRUE (expr1 <> 0 および expr1 <> NULL) の場合、IF() は expr2 を返します。それ以外の場合は expr3 を返します。IF() は、使用されているコンテキストに応じて、数値または文字列値を返します。

文字列なら空文字、日付型なら0000-00-00 00:00:00をfalseとしてくれる。型で忖度してくれるのは大きい。
IF()が使える場合は素直にIF()を使おう。

この記事は役に立ちましたか?
  • (`・ω・´) 役に立った (0)
  • _(:3」∠)_ 面白かった (2)
  • (・∀・) 参考になった (4)