SQL関数
Oracleにあらかじめ組み込まれているファンクションがあります。
例えば、小文字を大文字に変換するUPPERなどです。UPPERは列名指定で受け取った文字列を大文字に変換してくれるのですが、これは1件毎に処理し1件毎に結果を戻す単一行関数と呼ばれるものです。
対してavgの様に複数の結果を受け取って一つの値を返す、グループ関数というものもあるのですが、本章では単一行関数を扱います。
関数名( 引数1, 引数2…) ;
が基本形なのですが、これはSELECT句以外でもWHERE句、ORDER BY句でも使用できます。
文字列関数
UPPER/LOWER
UPPER( 文字列 )
文字列を全て大文字に変換する。
WHERE句でも使えます。その時は比較する文字列は大文字じゃないとダメですよ。
ちなみに、こんな感じで使います。
SELECT UPPER( yomi ) FROM EMPLOYEES ;
大文字にすることが出来れば、小文字にすることも出来ますよね。
LOWER( 文字列 )
文字列を全て小文字に変換する。
INITCAP
INITCAP( 文字列 )
先頭文字を大文字にします。
CONCAT
CONCAT( 文字列1, 文字列2 )
2つの文字列を結合して戻す。
SUBSTR
SUBSTR( 文字列, m ,n )
文字列のm番目の文字からn文字分の文字列を戻す。
ちょっと実例を見てみましょうか。
SELECT SUBSTR( 'SUGIMOTO', 5 ,4 ) …
だと、MOTOと表示されることになります。
ちなみに、nは省略可能で、その際はm文字目以降の全てが表示されます。
LENGTH
LENGTH( 文字列 )
文字列の文字数を返します。全角も記号も半角も1文字です。
INSTR
INSTR( 文字列1, 文字列2, m, n )
ちと複雑ですね。
文字列1のm文字目から文字列2を検索し、n回目に一致した文字列の位置を返します。
mとnは省略化で、その場合はどちらも1が入ります。
INSTR( 文字列1, 文字列2 )
そうなると、ちょっと簡単。
文字列1から文字列2を検索してヒットした文字列の位置を返す。
LPAD/RPAD
LPAD( 文字列, n, '埋め込み文字' ) RPAD( 文字列, n, '埋め込み文字' )
文字列がn文字になるように埋め込み文字を埋めて戻す。
Lは左に、Rは右に、埋め込みます。意味分かんないでしょうw
LPAD( yomi, 10, '*' )
******sato
:(以下略)
こうなる。って感じです。当たり前ですが、Rなら、
sato******
TRIM
TRIM( 文字列 )
文字列の前後にある削除文字(デフォルトは半角スペース)を削除し戻す。
これだけなら簡単なのですが、以下の様な使い方も出来ます。
TRIM( LEADING, '削除文字', FROM 文字列 ) TRIM( TRAILING, '削除文字', FROM 文字列 ) TRIM( BOTH, '削除文字', FROM 文字列 )
説明も面倒なので自分で調べましょう。
REPLACE
REPLACE( 文字列, 変更前文字列, 変更後文字列 )
変更前文字列を変更後文字列に置き換えて返す。要は、置換ですね。
変更後文字列は省略可能で、省略した場合は変更前文字列が削除されたものを返します。
数値関数
ここまでは文字列操作でしたが、ここからは数値を扱う関数をご紹介します。
ROUND
ROUND( 数値, n )
数値の小数点以下n桁に四捨五入して返す。
nは省略可で、整数値に四捨五入します。0が入っていると同じ扱いですね。
TRUNC
TRUNC( 数値, n )
数値の小数点以下n桁に切り捨てして返す。
nは省略可で、整数値になるよう切り捨てます。0が入っていると同じ扱いですね。
ROUNDとほぼ同じですね。
MOD
MOD( n, m )
nをmで割った余りを戻す関数です。
2章で四則演算が使えると説明があったと思いますが、余り算はありませんでしたよね。関数として実装されています。
日付関数
DBでは日付を扱うことが割と多いと思います。
関数の前にちょっと日付についてご説明いたします。
日付の基礎知識
日付値は、-年-月-日-時-分-秒で内部的な数値を持っている
デフォルトの書式(RR-MM-DD)がある。
格納形式は他の形にも出来るが別章参照。
日付の計算
加算や減算が出来ます。
日付 + 数値 日付 - 数値
日付として計算なので、+1すると一日後。つまり明日ですね。
-1は一日前、つまり昨日となります。
日付 + 数値/24 日付 - 数値/24
という記載になると、数値は時間として計算されます。
また日付値同士の減算が出来ます。この時の結果は、日数で表示されます。
日付 - 日付
ちなみに、加算は出来ませんので、ご注意を。
SYSDATE
現在の日付を返します。
SYSDATE
MONTHS_BETWEEN
引数1,引数2の間の月数を返します。
SYSDATE( 日付1, 日付2 )
ADD_MONTHS
引数に指定した日付のnヶ月後の日付を返す。
ADD_MONTHS( 日付, n )
最終日の扱いが独特なので気をつけましょう。
2/28の1ヶ月後は、3/31という考え方です。つまり末日扱いですね。
NEXT_DAY
引数に指定した日付の翌日以降に指定した曜日になる最初の日を返す。
NEXT_DAY( 日付, '曜日' )
LAST_DAY
引数に指定した日付を含む月の最終日の日付を返す。
LAST_DAY( 日付 )
ROUND
数値関数でもやったROUNDです。その引数に日付を受け入れるとどうなるかということです。
ROUND( 日付 [, '書式'] )
書式というのは、
年(YEAR)/月(MONTH)/日(DD)のどれかだと思ってください。
年:6/30以前なら当年の1月1日午前0時、以降なら翌年の1月1日午前0時
月:15日以前なら当月の1日午前0時、以降なら翌月1日午前0時
日:正午以前なら当日の午前0時、以降なら翌日の午前0時
TRUNC
TRUNCも数値関数でやってますよね。切り捨てです。
ROUND同様、これも日付を受け付けることが出来ます。
TRUNC( 日付 [, '書式'] )
書式は、年(YEAR)/月(MONTH)/日(DD)と、ROUNDと同様です。
年:当年の1月1日午前0時
月:当月の1日午前0時
日:当日の午前0時
それでは以下をやってみましょう。
今回は色々と飛ばしました。関数については必要になった時に調べましょう。
以下のデータは、EMPLOYEESテーブルから取得してください。 ・yomiを全て大文字に変換して表示 ・yomiの先頭文字を大文字に変換して表示 ・enameとyomiをくっつけて表示 ・入社年月日の月だけ抽出して表示 ・yomiの文字列をカウントして表示 ・yomiからdaの文字を検索し何文字目にあるか表示 ・入社してから今日までの日数を表示