データベースの空文字列
Oracleでcharまたはvarchar2の文字列フィールド
NAME VARCHAR2(32) (NULL可)
に対して、「nullまたはスペース文字列」という条件で問い合わせを行おうとして、次のようなWHERE句を書いた。
WHERE NAME IS NULL OR LTRIM(RTRIM(NAME)) = ''
これだと、NAMEがnullの場合しか引っかからない。TRIMが効いていないのかとか、いろいろ悩んだが、こうすると上手くいくことが分かった。
WHERE NAME IS NULL OR LTRIM(NAME) IS NULL
つまり、Oracleでは空文字列と文字列フィールドのNULLは同義に扱われるということだ。ついでに、NAMEがスペースならLTRIMでもRTRIMでも空文字列になるので、どちらかでよいことにも気づいた(気づくの遅い!)。ORにした方がたぶん時間がかかるので、最終形は
WHERE LTRIM(NAME) IS NULL
で良いかと。何も考えずに、Javaの文字列チェック*1と同じ感覚で書いた私が馬鹿だった。
ただし、Oracle以外のDBMSでは、この限りではない。
2005.10.26追記 : カテゴリを develop & programming にした。