MW211 EXIT

devlog
PostgreSQL/数値文字変換
2011年09月26日
本来数値である項目を事情があって文字型項目として保持してたりして
これを本来の数値型に変換して取得したい場合には、「TO_NUMBER()」を使う。
┌──────────────────────────────────────┐
│TO_NUMBER(列,'S999D0')                                                      │
└──────────────────────────────────────┘
こんな感じになる。
第二引数として、書式を指定してやるのがちょっとめんどくさいかも。

一方その反対に数値を文字型に変換するのは「TO_CHAR()」だ。
┌──────────────────────────────────────┐
│TO_CHAR(列,'S999D0')                                                        │
└──────────────────────────────────────┘
こんな感じ(TO_NUMBER()と同じ)。
日付型なんかは以下のような感じで変換できて便利。
┌──────────────────────────────────────┐
│TO_CHAR(列,'YYYY-MM-DD HH24:MI:SS')                                         │
└──────────────────────────────────────┘
さて、話は戻って「TO_NUMBER()」。
こいつが意外と厄介で、入力値(つまり参照する列)に文字列が混じっていると
エラーとなってしまうのである(NULLならOK、''はNG)。

そこで、ISNUMERIC的なことをして条件分岐させたいところだが、見当たらない。
ならばということで、正規表現で数値を抜き出す方法を代案として考えた。
┌──────────────────────────────────────┐
│SUBSTRING(列 FROM E'^\-*[0-9]+\.?[0-9]*$')                                  │
└──────────────────────────────────────┘
これならエラーを回避できる。
┌──────────────────────────────────────┐
│TO_NUMBER(SUBSTRING(列 FROM E'^\-*[0-9]+\.?[0-9]*$'),'S999D0')              │
└──────────────────────────────────────┘
文字列が混じっている場合は、NULLになる。
分類:PostgreSQL