使っているDBを選ぶと、型変換の書き方がわかります。列名を入れておくと、その名前に置き換えた形でコピーできます。
型変換の書き方はDBごとにこんなに違う
SQL は標準規格がありますが、型変換、とくに日付の書式は DB ごとの独自の関数が多く、「MySQL の DATE_FORMAT と Oracle の TO_CHAR で書式の書き方が違う」「SQL Server だけ書式番号を使う」といった違いでつまずきがちです。
複数の DB を扱う現場や、移行作業のときにこの早見表を使ってください。
| やりたいこと | MySQL | PostgreSQL | SQL Server | Oracle |
| 標準の変換 | CAST | CAST / :: | CAST / CONVERT | CAST / TO_NUMBER |
| 日付 → 文字列 | DATE_FORMAT | TO_CHAR | FORMAT / CONVERT | TO_CHAR |
| 文字列 → 日付 | STR_TO_DATE | TO_DATE | CONVERT | TO_DATE |
| NULL の置き換え | IFNULL | COALESCE | ISNULL | NVL |
| 失敗したら NULL | (なし) | (なし) | TRY_CAST | DEFAULT NULL ON CONVERSION ERROR |
日付の書式記号の対応表
いちばん間違えやすいのは「分」です。MySQL は %i、Oracle・PostgreSQL は MI、SQL Server の FORMAT は小文字の mm(大文字の MM は月)、SQLite は %M と、DB ごとにすべて違います。
書いたSQLを読みやすく整えるならSQL整形、Excelの値からIN句を作るなら改行⇔カンマ区切り変換、
INSERT文を作るならExcel表の変換も便利です。
よくある質問
CAST と CONVERT の違いは?
CAST は SQL の標準の書き方で、多くのDBで同じように使えます。CONVERT は SQL Server などの独自の関数で、日付の書式番号(111 や 120 など)を指定できるのが特長です。迷ったら CAST を使うと、ほかのDBに移すときも直しやすくなります。
暗黙の型変換に任せてもいいですか?
WHERE 列 = '123' のように型が違うまま比べると、DBが自動で変換してくれることがあります。ただし、インデックスが使われずに遅くなったり、'012' と 12 が一致したりと思わぬ結果になることがあるので、明示的に変換するのがおすすめです。
MySQL で CAST(列 AS INT) がエラーになります。
MySQL の CAST では INT や INTEGER と書けません。符号ありの整数は SIGNED、符号なしは UNSIGNED と書きます(例: CAST(col AS SIGNED))。
Oracle で日付を比べると一致しません。
Oracle の DATE 型は時刻も含んでいます。日付だけで比べたいときは TRUNC(列) で時刻を切り捨ててから比べてください。
変換・計算の結果は正確さに努めていますが、すべての入力での動作を保証するものではありません。
業務で使う場合は、重要なデータは結果を確認してからご利用ください。詳しくは免責事項をご覧ください。