Oracle SQL 関数その2
このページはページの再構築に伴い移転しました。3秒後にジャンプします。
ジャンプしない場合は、以下のURLをクリックしてください。
移転先のページ
日付を文字列へ変換
数値を文字列へ変換
文字列の日付型へ変換
文字列の数値への変換
文字列空白除去
数値切捨て処理
日付切捨て処理
文字列の前後処理
データ型の変換
TO_CHAR(日付) : 文字列へ変換
stringRet := TO_CHAR( dateSrc [ , stringFormat [ , nlsParam ] ] );
TO_CHARは日付データdateSrcを日付書式stringFormatに従ってVARCHAR2型のデータを返します。
stringFormatを指定しない場合はデフォルトの日付書式に従います。
nlsParamは月、日の名称及び略称の言語を指定します。
通常の処理でよく使用する書式文字
日付書式文字 |
変換内容 |
D |
曜日(1~7) |
DD |
日(1~31) |
DDD |
通年での日(1~366) |
E |
元号の略称 |
EE |
元号 |
HH |
時間(1~12) |
HH24 |
時間(0~23) |
MI |
分(0~59) |
MM |
月(01~12) |
YYYY |
年 |
YY |
年の下2桁 |
各書式文字の区切りとして"空白" "/" "-" "."
"," ":" ";"の文字が許されています。
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY MM DD HH24 MI SS' ) FMSP, |
2 TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24/MI/SS' ) FMSL, |
3 TO_CHAR(SYSDATE, 'YYYY.MM.DD HH24.MI.SS' ) FMDP, |
4 TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24-MI-SS' ) FMH, |
5 TO_CHAR(SYSDATE, 'YYYY,MM,DD HH24,MI,SS' ) FMC, |
6 TO_CHAR(SYSDATE, 'YYYY:MM:DD HH24:MI:SS' ) FMK, |
7 TO_CHAR(SYSDATE, 'YYYY;MM;DD HH24;MI;SS' ) FMSK FROM DUAL; |
2002 11 17 15 35 59 2002/11/17 15/35/59 2002.11.17 15.35.59 2002-11-17 15-35-59 2002,11,17 15,35,59 |
2002:11:17 15:35:59 2002;11;17 15;35;59 |
TO_CHAR(数値) : 文字列へ変換
stringRet := TO_CHAR( numberSrc [ , stringFormat [ , nlsParam ] ] );
TO_CHARは数値データnumberSrcを日付書式stringFormatに従ってVARCHAR2型のデータを返します。
stringFormatを指定しない場合はデフォルトの日付書式に従います。
nlsParamは月、日の名称及び略称の言語を指定します。
通常の処理でよく使用する書式文字
日付書式文字 |
変換内容 |
,(カンマ) |
指定した位置にカンマを返す |
.(ピリオド) |
指定した位置に小数点を返す(書式の中で1個のみ指定) |
0 |
先行0を返します |
9 |
正の値の場合は先頭空白を埋め込み、負の場合には負の記号を先頭に埋め込んで指定の桁数にして返す |
S |
負の値は(-)を、正の値は(+)を前に付ける。(Sが先頭に在る場合) |
FM |
前後に空白を付けずに返す |
SQL> SELECT ( '' '' || TO_CHAR(12345.6789, '999,999.999' ) || '' '' ) fm1, |
2 ( '' '' || TO_CHAR(12345.6789, '099,999.9999' ) || '' '' ) fm2, |
3 ( '' '' || TO_CHAR(12345.6789, 'FM999,999.999' ) || '' '' ) fm3, |
4 ( '' '' || TO_CHAR(12345.6789, 'FM099,999.9999' ) || '' '' ) fm4, |
5 ( '' '' || TO_CHAR(-12345.6789, '999,999.999' ) || '' '' ) fm5, |
6 ( '' '' || TO_CHAR(-12345.6789, '099,999.9999' ) || '' '' ) fm6, |
7 ( '' '' || TO_CHAR(-12345.6789, 'S999,999.999' ) || '' '' ) fm7, |
8 ( '' '' || TO_CHAR(-12345.6789, 'S099,999.9999' ) || '' '' ) fm8, |
9 ( '' '' || TO_CHAR(-12345.6789, '999,999.999S' ) || '' '' ) fm9, |
10 ( '' '' || TO_CHAR(-12345.6789, '099,999.9999S' ) || '' '' ) fm10, |
11 ( '' '' || TO_CHAR(12345.6789, '$999,999.999' ) || '' '' ) fm11, |
12 ( '' '' || TO_CHAR(12345.6789, '$099,999.9999' ) || '' '' ) fm12 |
FM7 FM8 FM9 FM10 FM11 FM12 |
' 12,345.679' ' 012,345.6789' '12,345.679' '012,345.6789' ' -12,345.679' '-012,345.6789' |
' -12,345.679' '-012,345.6789' ' 12,345.679-' '012,345.6789-' ' $12,345.679' ' $012,345.6789' |
尚、数値が指定桁数より大きい場合には桁数分だけ"#"が返される為、指定桁数は十分な桁数が必要です。
SQL> SELECT TO_CHAR(123456789, '99,999,999' ) FMT8, |
2 TO_CHAR(123456789, '999,999,999' ) FMT9 FROM DUAL; |
TO_DATE : 日付型へ変換
dateRet := TO_DATE( stringSrc [ , stringFormat [ , nlsParam ] ] );
TO_DATEは文字列型データstringSrcを日付書式stringFormatに従ってDATE型のデータを返します。
stringFormatを指定しない場合はデフォルトの日付書式に従います。
nlsParamは月、日の名称及び略称の言語を指定します。
SQL> SELECT TO_DATE( '2002/10/01 12:30:00' , 'YYYY/MM/DD HH24:MI:SS' ), |
2 TO_CHAR(TO_DATE( '2002/10/01 12:30:00' , 'YYYY/MM/DD HH24:MI:SS' ), 'YYYY/MM/DD HH24:MI:SS' ) |
TO_DATE( TO_CHAR(TO_DATE('20 |
02-10-01 2002/10/01 12:30:00 |
TO_NUMBER : 数値への変換
numberRet := TO_NUMBER( stringSrc [ , stringFormat [ , nlsParam ] ] );
TO_NUMBERは文字列型データstringSrcを日付書式stringFormatに従ってNUMBER型のデータを返します。
stringFormatを指定しない場合はデフォルトの日付書式に従います。
nlsParamは月、日の名称及び略称の言語を指定します。
stringFormat,nlsParamは通常使用したことがありません。

TRIM : 文字列空白除去
stringRet := TRIM( [ [ LEADING | TRAILING | BOTH ] stringTrimChar FROM ] stringSrc );
LEADINGを指定 :stringSrcの先頭からstringTrimCharの文字を削除されます。
TRAILINGを指定:stringSrcの最後からstringTrimCharの文字を削除されます。
BOTHを指定か指定無:stringSrcの先頭及び最後からstringTrimCharの文字を削除されます。
stringTrimCharを指定しない場合はデフォルトで空白が削除されます。
stringSrcのみ指定された場合は先頭及び最後から空白が削除されます。
stringTrimChar, stringSrcのいづれかがNULLの場合はNULLを返します。
(stringTrimChar:1個のみの文字の指定)
SQL> SELECT TRIM(LEADING '0' FROM '00088899900' ) LEADING, |
2 TRIM(TRAILING '0' FROM '00088899900' ) TRAILING, |
3 TRIM(BOTH '0' FROM '00088899900' ) BOTH, |
4 TRIM( '0' FROM '00088899900' ) BOTH2, |
5 TRIM( ' 8888999 ' ) SPACE , |
6 TRIM( NULL FROM '00088899900' ) NULL1, |
LEADING TRAILING BOTH BOTH2 SPACE N N |
88899900 000888999 888999 888999 8888999 |
TRIMに似た関数としてLTRIM,RTRIMがあります。
stringRet := xTRIM( stringSrc [ , stringTrim ] );
stringSrcの左側(右側)にあるstringTrimに設定された文字を削除します。
stringSrcの左(右)から検索しstringTrimの文字以外が見つかった時点で処理をやめて文字列を返します。
尚、stringTrimのデフォルト値は空白です。
SQL> SELECT LTRIM( '0008889900' , '08' ) LT_1,LTRIM( '0008889900' , '80' ) LT_2,LTRIM( ' 0008889900' ) LT_3, |
2 RTRIM( '0008889900' , '09' ) RT_1,RTRIM( '0008889900' , '90' ) RT_2,RTRIM( '0008889900 ' ) RT_3 |
LT_1 LT_2 LT_3 RT_1 RT_2 RT_3 |
9900 9900 0008889900 000888 000888 0008889900 |
TRUNC(数値) : 切捨て処理
numberRet := TRUNC( numberSrc [ , numberUnit ] );
TRUNCは数値データnumberSrcを小数点以下numberUnit桁までに切り捨てた数値を返します。
numberUnitが省略されると0(ゼロ)と指定したことと同様で、小数点以下を切り捨てます。
numberUnitが負の場合は、小数点から見てnumberUnit*(-1)の位置の桁以下を全て0にします。
numberUnitの値と切り捨てる桁についてはROUND関数と似ています。
numberUnit値 |
切り捨てる桁 |
3 |
小数点以下4桁目 |
2 |
小数点以下3桁目 |
1 |
小数点以下2桁目 |
0 |
小数点以下1桁目 |
-1 |
一の位の桁 |
-2 |
十の位の桁 |
-3 |
百の位の桁 |
SQL> SELECT TRUNC(1234.5678, 3) DP4 ,TRUNC(1234.5678, 2) DP3 , |
2 TRUNC(1234.5678, 1) DP2 ,TRUNC(1234.5678, 0) DP1 , |
3 TRUNC(1999.5678,-1) DPL1,TRUNC(1999.5678,-2) DPL2,TRUNC(1999.5678,-3) DPL3 |
DP4 DP3 DP2 DP1 DPL1 DPL2 DPL3 |
1234.567 1234.56 1234.5 1234 1990 1900 1000 |
TRUNC(日付) : 切捨て処理
dateRet := TRUNC( dateSrc [ , dateFormat ] );
TRUNCは日付データdateSrcを書式dateFormatに指定された単位まで近似した日付データを返します。
dateFormatはROUND(日付)と同じものを用います。
dateFormat |
丸め処理 |
YYYY,YEAR |
年(7月1日で切り上げ) |
Q |
四半期 |
MONTH,MM |
月(16日で切り上げ) |
DD |
日 |
DAY |
週の開始日 |
HH,HH12,HH24 |
時 |
MI |
分 |
SQL> SELECT TRUNC(TO_DATE( '2002/06/30' ), 'YEAR' ) YEAR0630, |
2 TRUNC(TO_DATE( '2002/07/01' ), 'YEAR' ) YEAR0701, |
3 TRUNC(TO_DATE( '2002/06/30' ), 'Q' ) Q, |
4 TRUNC(TO_DATE( '2002/06/15' ), 'MM' ) MM0615 , |
5 TRUNC(TO_DATE( '2002/06/16' ), 'MM' ) MM0616, |
6 TRUNC(TO_DATE( '2002/06/15 23:50:00' , 'YYYY/MM/DD HH24:MI:SS' ), 'DD' ) DD, |
7 TO_CHAR(TRUNC(TO_DATE( '2002/06/15 23:29:00' , 'YYYY/MM/DD HH24:MI:SS' ), 'HH24' ) |
8 'YYYY/MM/DD HH24:MI:SS' ) HH24 |
YEAR0630 YEAR0701 Q MM0615 MM0616 DD HH24 |
02-01-01 02-01-01 02-04-01 02-06-01 02-06-01 02-06-15 2002/06/15 23:00:00 |
LPAD , RPAD : 文字列の前後処理
strRet := LPAD( strSrc , n , strPad );
LPAD及びRPADは文字列データstrSrcを左側(右側に)連続してstrPadを埋めてn桁分の文字列を返します。
2 '<' || LPAD( 'ABC' ,10) || '>' AS LPAD1 |
3 , '<' || LPAD( 'ABC' ,10, '*' ) || '>' AS LPAD2 |
4 , '<' || LPAD( 'ABC' ,10, '*+' ) || '>' AS LPAD3 |
5 , '<' || LPAD( 'ABC' ,10, '1234567890' ) || '>' AS LPAD4 |
6 , '<' || RPAD( 'ABC' ,10) || '>' AS RPAD1 |
7 , '<' || RPAD( 'ABC' ,10, '*' ) || '>' AS RPAD2 |
8 , '<' || RPAD( 'ABC' ,10, '*+' ) || '>' AS RPAD3 |
9 , '<' || RPAD( 'ABC' ,10, '1234567890' ) || '>' AS RPAD4 |
LPAD1 LPAD2 LPAD3 LPAD4 RPAD1 RPAD2 RPAD3 RPAD4 |
< ABC> <*******ABC> <*+*+*+*ABC> <1234567ABC> <ABC > <ABC*******> <ABC*+*+*+*> <ABC1234567> |
CAST : データの変換
Ret := CAST( <expr> AS <データ型> );
CASTは<expr>で指定されたデータを<データ型>で指定されたデータ型に変換します。
以下に例を示します。最初のSQL文はNUMERIC型からCHAR,VARCHAR2型への変換ですが、CHAR型の場合は指定桁分の結果が返されるので、固定桁の表示がほしいときには利用できます。次のSQL文はDATE型からCHAR,VARCHAR2型への変換と、CHAR型からDATE型への変換です。'CHAR_TO_DATE'の結果はDATE型そのもを表示しても面白くないので、TO_CHAR関数で再びCHAR型へ書式付で変換しています。時刻がクリアされて変換されるところが注意するところです。
SQL> SELECT 1 AS NUM_TEST |
2 , '#' || CAST (1 AS CHAR (10)) || '#' AS NUM_TO_CHAR |
3 , '#' || CAST (1 AS VARCHAR2(10)) || '#' AS NUM_TO_VARCHAR2 FROM DUAL; |
NUM_TEST NUM_TO_CHAR NUM_TO_VARCH |
SQL> SELECT '#' || CAST (SYSDATE AS CHAR (20)) || '#' AS DATE_TO_CHAR |
2 , '#' || CAST (SYSDATE AS VARCHAR2(20)) || '#' AS DATE_TO_VARCHAR2 |
3 ,TO_CHAR( CAST ( '2005/01/22' AS DATE ), 'YYYY/MM/DD HH24:MI:SS' ) AS CHAR_TO_DATE FROM DUAL; |
DATE_TO_CHAR DATE_TO_VARCHAR2 CHAR_TO_DATE |
#05-03-07 # #05-03-07# 2005/01/22 00:00:00 |