argius note

プログラミング関連

データベースの空文字列

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 にした。

*1:Javaで (string == null || string.trim().length() == 0) と書くのと同じように。