MW211 EXIT

devlog
Oracle/空文字への置換は注意
2018年07月25日
REPLACE()は検索文字に一致した部分を置換する関数だが
TRANSLATE()は検索文字のいずれかに一致した部分を置換してくれる関数だ。
┌──────────────────────────────────────┐
│TRANSLATE(列, '0123456789', ' ')                                            │
└──────────────────────────────────────┘
数値だけを空白に置換する場合には、以下のようにすればよい。

┌──────────────────────────────────────┐
│TRANSLATE(列, '0123456789', '')                                       →NULL│
└──────────────────────────────────────┘
でも、空文字に置換してしまうと、結果は(如何なる場合も)NULLになってしまう。
これは空文字をNULLと同一とみなすOracle特有の事情のようだ。

従って、一回適当な文字(ここでは「0」)に置換して統一した上で
REPLACE()でまとめて置換するのがよいようだ。
┌──────────────────────────────────────┐
│REPLACE(TRANSLATE(列, '0123456789', '0'), '0', '')                          │
└──────────────────────────────────────┘
REPLACE()の場合は、空文字に置換しても問題はない。

数字のみで構成されるかを確認する場合には、TRIM()を使って簡素化できる。
┌──────────────────────────────────────┐
│TRIM(TRANSLATE(列, '0123456789', ' '))                                      │
└──────────────────────────────────────┘
NULLだった場合(IS NULLが真の場合)、数字のみだった訳だ。
→置換して空欄(=NULL)となった訳だから
分類:Oracle