SQLの型変換の書き方(DB別早見表)

チートシートPDF

使っているDBを選ぶと、型変換の書き方がわかります。列名を入れておくと、その名前に置き換えた形でコピーできます。

文字列 → 数値

文字列を整数にする '123' → 123
🐬 MySQL
CAST({col} AS SIGNED)
別の書き方 CAST({col} AS UNSIGNED)

💡 MySQL の CAST では INT と書けない。符号ありは SIGNED、なしは UNSIGNED。

🐘 PostgreSQL
CAST({col} AS INTEGER)
別の書き方 {col}::integer

💡 「::型名」は PostgreSQL 独自の短い書き方。

🪟 SQL Server
CAST({col} AS INT)
別の書き方 CONVERT(INT, {col})

💡 変換できない値があるとエラー。NULL にしたいなら TRY_CAST。

🔶 Oracle
TO_NUMBER({col})
別の書き方 CAST({col} AS NUMBER(10))
🪶 SQLite
CAST({col} AS INTEGER)

💡 数字でない文字列は 0 になる(エラーにならない)。'12abc' は 12。

文字列を小数にする '123.45' → 123.45
🐬 MySQL
CAST({col} AS DECIMAL(10,2))

💡 DECIMAL(全体の桁数, 小数の桁数)。

🐘 PostgreSQL
CAST({col} AS NUMERIC(10,2))
別の書き方 {col}::numeric
🪟 SQL Server
CAST({col} AS DECIMAL(10,2))
別の書き方 TRY_CAST({col} AS DECIMAL(10,2))
🔶 Oracle
TO_NUMBER({col})
別の書き方 CAST({col} AS NUMBER(10,2))

💡 カンマ入りは TO_NUMBER({col}, '999,999.99') のように書式を指定。

🪶 SQLite
CAST({col} AS REAL)
カンマ入りの文字列を数値にする '1,234' → 1234
🐬 MySQL
CAST(REPLACE({col}, ',', '') AS SIGNED)
🐘 PostgreSQL
CAST(REPLACE({col}, ',', '') AS INTEGER)
別の書き方 TO_NUMBER({col}, '999,999,999')
🪟 SQL Server
CAST(REPLACE({col}, ',', '') AS INT)
🔶 Oracle
TO_NUMBER({col}, '999,999,999')
別の書き方 TO_NUMBER(REPLACE({col}, ',', ''))
🪶 SQLite
CAST(REPLACE({col}, ',', '') AS INTEGER)

数値 → 文字列

数値を文字列にする 123 → '123'
🐬 MySQL
CAST({n} AS CHAR)
別の書き方 CONCAT({n})
🐘 PostgreSQL
CAST({n} AS TEXT)
別の書き方 {n}::text
🪟 SQL Server
CAST({n} AS VARCHAR(20))
別の書き方 CONVERT(VARCHAR(20), {n})

💡 長さを省略すると30文字になる。長さは指定しておくのが安全。

🔶 Oracle
TO_CHAR({n})
🪶 SQLite
CAST({n} AS TEXT)
ゼロ埋めする(桁をそろえる) 5 → '00005'
🐬 MySQL
LPAD({n}, 5, '0')
🐘 PostgreSQL
LPAD({n}::text, 5, '0')
別の書き方 TO_CHAR({n}, 'FM00000')

💡 TO_CHAR は FM を付けないと先頭に空白が入る。

🪟 SQL Server
RIGHT('00000' + CAST({n} AS VARCHAR(5)), 5)
別の書き方 FORMAT({n}, '00000')

💡 FORMAT は 2012 以降。件数が多いと遅い。

🔶 Oracle
LPAD({n}, 5, '0')
別の書き方 TO_CHAR({n}, 'FM00000')
🪶 SQLite
printf('%05d', {n})
3桁ごとにカンマを付ける 1234567 → '1,234,567'
🐬 MySQL
FORMAT({n}, 0)

💡 2番目の引数は小数の桁数。

🐘 PostgreSQL
TO_CHAR({n}, 'FM999,999,999')

💡 桁数より大きい値は # になるので、9 を十分に並べる。

🪟 SQL Server
FORMAT({n}, 'N0')
別の書き方 FORMAT({n}, '#,0')

💡 FORMAT は 2012 以降。

🔶 Oracle
TO_CHAR({n}, 'FM999,999,999')
🪶 SQLite
-- 標準関数では難しい(アプリ側での整形がおすすめ)
文字列と数値をつなげる 'No.' と 5 → 'No.5'
🐬 MySQL
CONCAT('No.', {n})

💡 MySQL の || は(設定によって)OR の意味になるので CONCAT を使う。

🐘 PostgreSQL
'No.' || {n}
別の書き方 CONCAT('No.', {n})
🪟 SQL Server
CONCAT('No.', {n})
別の書き方 'No.' + CAST({n} AS VARCHAR(20))

💡 'No.' + 5 は数値に変換しようとしてエラーになる。

🔶 Oracle
'No.' || {n}
別の書き方 CONCAT('No.', {n})
🪶 SQLite
'No.' || {n}

日付・日時

文字列を日付にする '2025/04/01' → 日付
🐬 MySQL
STR_TO_DATE({s}, '%Y/%m/%d')

💡 '2025-04-01' の形なら CAST({s} AS DATE) でも可。

🐘 PostgreSQL
TO_DATE({s}, 'YYYY/MM/DD')
別の書き方 {s}::date
🪟 SQL Server
CONVERT(DATE, {s}, 111)
別の書き方 TRY_CONVERT(DATE, {s}, 111)

💡 111 は yyyy/mm/dd の書式番号。ハイフン区切りなら CAST({s} AS DATE)。

🔶 Oracle
TO_DATE({s}, 'YYYY/MM/DD')
🪶 SQLite
date(REPLACE({s}, '/', '-'))

💡 SQLite に日付型は無く、'YYYY-MM-DD' の文字列で扱う。

文字列を日時にする '2025-04-01 13:45:00' → 日時
🐬 MySQL
STR_TO_DATE({s}, '%Y-%m-%d %H:%i:%s')
別の書き方 CAST({s} AS DATETIME)

💡 分は %i(%M は月の名前になるので注意)。

🐘 PostgreSQL
TO_TIMESTAMP({s}, 'YYYY-MM-DD HH24:MI:SS')
別の書き方 {s}::timestamp
🪟 SQL Server
CONVERT(DATETIME2, {s}, 120)

💡 120 は yyyy-mm-dd hh:mi:ss の書式番号。

🔶 Oracle
TO_TIMESTAMP({s}, 'YYYY-MM-DD HH24:MI:SS')
別の書き方 TO_DATE({s}, 'YYYY-MM-DD HH24:MI:SS')

💡 分は MI(MM は月)。24時間表記は HH24。

🪶 SQLite
datetime({s})
日付を書式指定で文字列にする 日付 → '2025/04/01'
🐬 MySQL
DATE_FORMAT({d}, '%Y/%m/%d')
🐘 PostgreSQL
TO_CHAR({d}, 'YYYY/MM/DD')
🪟 SQL Server
FORMAT({d}, 'yyyy/MM/dd')
別の書き方 CONVERT(VARCHAR(10), {d}, 111)

💡 FORMAT は .NET の書式で、月は大文字の MM、分は小文字の mm。

🔶 Oracle
TO_CHAR({d}, 'YYYY/MM/DD')
🪶 SQLite
strftime('%Y/%m/%d', {d})
日付を「2025年04月01日」にする 日付 → '2025年04月01日'
🐬 MySQL
DATE_FORMAT({d}, '%Y年%m月%d日')

💡 月日をゼロ埋めしないなら %c月%e日。

🐘 PostgreSQL
TO_CHAR({d}, 'YYYY"年"MM"月"DD"日"')

💡 書式の中の日本語はダブルクォートで囲む。ゼロ埋めしないなら FMMM・FMDD。

🪟 SQL Server
FORMAT({d}, 'yyyy年MM月dd日')

💡 ゼロ埋めしないなら yyyy年M月d日。

🔶 Oracle
TO_CHAR({d}, 'YYYY"年"MM"月"DD"日"')
🪶 SQLite
strftime('%Y年%m月%d日', {d})
日時から日付だけ取り出す(時刻を切り捨て) 2025-04-01 13:45 → 2025-04-01
🐬 MySQL
DATE({dt})
別の書き方 CAST({dt} AS DATE)
🐘 PostgreSQL
{dt}::date
別の書き方 DATE_TRUNC('day', {dt})

💡 DATE_TRUNC は日時型のまま 00:00:00 にする。

🪟 SQL Server
CAST({dt} AS DATE)
🔶 Oracle
TRUNC({dt})

💡 Oracle の DATE 型は時刻も持っているので、日付で比べるときは TRUNC が必要。

🪶 SQLite
date({dt})
UNIX時間(秒)を日時にする 1700000000 → 2023-11-14 22:13:20(UTC)
🐬 MySQL
FROM_UNIXTIME({n})

💡 セッションのタイムゾーンで返る。

🐘 PostgreSQL
TO_TIMESTAMP({n})

💡 timestamptz(タイムゾーン付き)で返る。

🪟 SQL Server
DATEADD(SECOND, {n}, '1970-01-01')

💡 UTC の日時になる。日本時間は DATEADD(HOUR, 9, …)。

🔶 Oracle
DATE '1970-01-01' + {n} / 86400

💡 UTC の日時になる。

🪶 SQLite
datetime({n}, 'unixepoch')
別の書き方 datetime({n}, 'unixepoch', 'localtime')
日時をUNIX時間(秒)にする 2023-11-14 22:13:20(UTC) → 1700000000
🐬 MySQL
UNIX_TIMESTAMP({dt})
🐘 PostgreSQL
EXTRACT(EPOCH FROM {dt})
🪟 SQL Server
DATEDIFF(SECOND, '1970-01-01', {dt})
別の書き方 DATEDIFF_BIG(SECOND, '1970-01-01', {dt})

💡 2038年以降の日時は DATEDIFF_BIG(2016以降)。

🔶 Oracle
(CAST({dt} AS DATE) - DATE '1970-01-01') * 86400
🪶 SQLite
strftime('%s', {dt})
別の書き方 unixepoch({dt})

💡 unixepoch() は 3.38 以降。

計算・丸め

整数どうしの割り算で小数を出す 5 / 2 → 2.5(2 にしない)
🐬 MySQL
{n} / 2

💡 MySQL の / は小数で返る(5 / 2 = 2.5000)。整数の割り算は DIV。

🐘 PostgreSQL
{n} / 2.0
別の書き方 CAST({n} AS NUMERIC) / 2

💡 整数 / 整数 は小数が切り捨てられる(5 / 2 = 2)。

🪟 SQL Server
{n} * 1.0 / 2
別の書き方 CAST({n} AS DECIMAL(10,2)) / 2

💡 整数 / 整数 は小数が切り捨てられる(5 / 2 = 2)。

🔶 Oracle
{n} / 2

💡 Oracle の NUMBER は小数で返る(5 / 2 = 2.5)。

🪶 SQLite
{n} * 1.0 / 2
別の書き方 CAST({n} AS REAL) / 2

💡 整数 / 整数 は小数が切り捨てられる(5 / 2 = 2)。

四捨五入・切り捨て・切り上げ 123.456 → 123.46 / 123.45 / 124
🐬 MySQL
ROUND({n}, 2)
別の書き方 TRUNCATE({n}, 2) / CEIL({n})

💡 ROUND・TRUNCATE の2番目は小数の桁数。

🐘 PostgreSQL
ROUND({n}, 2)
別の書き方 TRUNC({n}, 2) / CEIL({n})

💡 double precision 型は ROUND(値, 桁) が使えないので numeric にキャストする。

🪟 SQL Server
ROUND({n}, 2)
別の書き方 ROUND({n}, 2, 1) / CEILING({n})

💡 ROUND の3番目に 1 を指定すると切り捨て。切り上げは CEILING。

🔶 Oracle
ROUND({n}, 2)
別の書き方 TRUNC({n}, 2) / CEIL({n})
🪶 SQLite
ROUND({n}, 2)
別の書き方 CAST({n} AS INTEGER)

💡 CAST AS INTEGER は 0 に近い方への切り捨て(小数点以下を捨てる)。

NULL・エラー対策

NULLを別の値にする NULL → 0
🐬 MySQL
IFNULL({col}, 0)
別の書き方 COALESCE({col}, 0)
🐘 PostgreSQL
COALESCE({col}, 0)
🪟 SQL Server
ISNULL({col}, 0)
別の書き方 COALESCE({col}, 0)
🔶 Oracle
NVL({col}, 0)
別の書き方 COALESCE({col}, 0)

💡 Oracle では空文字 '' も NULL として扱われる。

🪶 SQLite
IFNULL({col}, 0)
別の書き方 COALESCE({col}, 0)
変換できない値はNULLにする(エラーにしない) 'abc' → NULL
🐬 MySQL
CASE WHEN {col} REGEXP '^-?[0-9]+$' THEN CAST({col} AS SIGNED) END

💡 専用の関数は無い。CAST は失敗しても警告で 0 などになる。

🐘 PostgreSQL
CASE WHEN {col} ~ '^-?[0-9]+$' THEN {col}::integer END
別の書き方 CASE WHEN pg_input_is_valid({col}, 'integer') THEN {col}::integer END

💡 pg_input_is_valid は 16 以降。

🪟 SQL Server
TRY_CAST({col} AS INT)
別の書き方 TRY_CONVERT(INT, {col})

💡 2012 以降。日付なら TRY_CONVERT(DATE, {col})。

🔶 Oracle
TO_NUMBER({col} DEFAULT NULL ON CONVERSION ERROR)
別の書き方 VALIDATE_CONVERSION({col} AS NUMBER)

💡 12c R2(12.2)以降。VALIDATE_CONVERSION は変換できれば 1 を返す。

🪶 SQLite
CASE WHEN {col} GLOB '[0-9]*' AND {col} NOT GLOB '*[^0-9]*' THEN CAST({col} AS INTEGER) END

💡 CAST はエラーにならず 0 になるため、事前に判定する。

型変換の書き方はDBごとにこんなに違う

SQL は標準規格がありますが、型変換、とくに日付の書式は DB ごとの独自の関数が多く、「MySQL の DATE_FORMAT と Oracle の TO_CHAR で書式の書き方が違う」「SQL Server だけ書式番号を使う」といった違いでつまずきがちです。 複数の DB を扱う現場や、移行作業のときにこの早見表を使ってください。

やりたいことMySQLPostgreSQLSQL ServerOracle
標準の変換CASTCAST / ::CAST / CONVERTCAST / TO_NUMBER
日付 → 文字列DATE_FORMATTO_CHARFORMAT / CONVERTTO_CHAR
文字列 → 日付STR_TO_DATETO_DATECONVERTTO_DATE
NULL の置き換えIFNULLCOALESCEISNULLNVL
失敗したら NULL(なし)(なし)TRY_CASTDEFAULT NULL ON CONVERSION ERROR

日付の書式記号の対応表

意味MySQLPostgreSQL / OracleSQL Server(FORMAT)SQLite
年(4桁)%YYYYYyyyy%Y
月(2桁)%mMMMM%m
日(2桁)%dDDdd%d
時(24時間)%HHH24HH%H
分%iMImm%M
秒%sSSss%S

いちばん間違えやすいのは「分」です。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(列) で時刻を切り捨ててから比べてください。

変換・計算の結果は正確さに努めていますが、すべての入力での動作を保証するものではありません。 業務で使う場合は、重要なデータは結果を確認してからご利用ください。詳しくは免責事項をご覧ください。