どもです。
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ライクなのは「<>」の方かな。
追記
'' <>'' ⇒ FALSE
BINARY '' <>'' ⇒ FALSE
--------------------------
'0' <>'' ⇒ TRUE
'1' <>'' ⇒ TRUE
BINARY '0' <>'' ⇒ TRUE
--------------------------
0 <>'' ⇒ FALSE
1 <>'' ⇒ TRUE
BINARY 0 <>'' ⇒ TRUE
--------------------------
NULL <>'' ⇒ NULL
BINARY NULL <>'' ⇒ NULL
数値型と比較すると、0もFALSEになるようです。厳密に比較したい場合はBINARYを使います。
知らずに使うとドツボに嵌りそうですが、知って使う分には便利そう。