2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ORACLEの空文字の扱いにハマった話。

Last updated at Posted at 2020-04-28

とあるアプリの構築時に出してしまったバグ。

  • 以下のSQL/SELECTで、メアドの有無が正しく拾えない。
(
  CASE
    WHEN  e_mail_address    IS NOT NULL
          AND
          e_mail_address    != ''
    THEN  1
    ELSE  0
  END
)                       AS has_e_mail_address

調べてみたら、こんな記事が見つかった。

  • [http://blog.livedoor.jp/i_am_best/archives/7870002.html](Oracle では文字長 0 の文字型カラム値は勝手に NULL になってしまう!?)
    • どうやらORACLEは、「''」をNULLとして扱うらしい。

検証してみる。

SELECT
     (CASE WHEN TRIM(' ')            = ''    THEN 1 ELSE 0 END)  AS TRIM_SPACE_EQUAL_EMPTY,          -- 0
     (CASE WHEN TRIM(' ')            = NULL  THEN 1 ELSE 0 END)  AS TRIM_SPACE_EQUAL_NULL,           -- 0
     (CASE WHEN TRIM(' ')            IS NULL THEN 1 ELSE 0 END)  AS TRIM_SPACE_IS_NULL,              -- 1
 --  (CASE WHEN TRIM(' ')            IS ''   THEN 1 ELSE 0 END)  AS TRIM_SPACE_IS_EMPTY,             -- ERROR
     (CASE WHEN REPLACE('A','A','')  = ''    THEN 1 ELSE 0 END)  AS REPLACE_TO_EMPTY_EQUAL_NULL,     -- 0
     (CASE WHEN REPLACE('A','A','')  IS NULL THEN 1 ELSE 0 END)  AS REPLACE_CHAR_TO_EMPTY_IS_NULL,   -- 1
 --  (CASE WHEN REPLACE('A','A','')  IS ''   THEN 1 ELSE 0 END)  AS REPLACE_CHAR_TO_EMPTY_IS_EMPTY,  -- ERROR
     NULL                                                        AS dummy
 FROM
     DUAL
  • ヒントを元に考えると、この書き方が正しい様子。テスト結果もOKになった。
NVL2(TRIM(e_mail_address), 1, 0)

雑感

  • こんなん、他のDB触ってた人は絶対間違えるがな…。
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?