いつか、技術ブログを

新人SE(OJT中)が技術ブログを書きたがっているブログです

【Oracle SQL】文字関数を書く練習問題を作ってみた

Oracle Master BronzeのSQLを受験する予定なのですが、文字列を操作する関数の使い方がまだおぼえられません。
なので、簡単な練習問題を作って勉強してみました。
ちなみに、選択肢を選ぶより1からSQLを書けるようにした方が実務でも役に立つと思い、SQLを書く形式にしました。

使用するテーブル

今回使用するテーブルは、↓のEMP表です。(全レコードではなく、抜粋した10件しか表示されていません)
f:id:ramenchahan:20190530120302p:plain
f:id:ramenchahan:20190530120324p:plain
※列名や表名は問題内に記載してるので、ざっと見ていただければOKです!
では、問題に入っていきます!

問題①

emp表から、empno列とename列を結合し、「q1」列として表示してください。
<想定結果>
Q1
-------------
7839KING
7698BLAKE
7782CLARK
(以下略)

問題①の答え

SELECT CONCAT(empno, ename) q1 
FROM emp;  

CONCAT関数は、以下のように記述します。

CONCAT(文字列①, 文字列②)
→「文字列①」と「文字列②」を結合

ちなみに、empnoの値は数値型ですが、CONCAT関数が処理するときに文字列型に暗黙的に型変換されるため、エラーは発生しません。

問題②

emp表から、enameの3文字目が'A'の人のenameを表示してください。
※文字関数を使って書いてみてください!
<想定結果>
EMP
-------------
BLAKE
CLARK
ADAMS

問題②の答え

SELECT ename  
FROM emp  
WHERE SUBSTR(ename, 3, 1) = 'A';  

SUBSTR関数の書式は、以下の通りです。

SUBSTR(対象文字列, 開始位置, 長さ)  
→「対象文字列」について、「開始位置」番目の文字から「長さ」分の文字を切り取る

つまり、SUBSTR(ename, 3, 1)は、ename列の3文字目から1文字を切り取る、ということを意味します。
(切り取った部分のみが戻されるということです)
ちなみに、文字関数を使わず、ワイルドカードを用いると、以下のようになります。

SELECT ename  
FROM emp  
WHERE ename LIKE '__A%' ;  

問題③

emp表から、ename列とenameの文字数(q3列とする)を表示してください。
<想定結果>
ENAME | Q3
---------------
KING  | 4
BLAKE | 5
CLARK | 5
(以下略)

問題③の答え

SELECT ename, LENGTH(ename) q3  
FROM emp;  

LENGTH関数の書式は、下記の通りです。

LENGTH(文字列)
→「文字列」の長さを求める

LENGTH関数は引数も1つしか取らないですし、分かりやすい関数でありがたいですね!

問題④

emp表から、ename列の10文字に満たない部分に'X'を埋めて、q4列として表示してください。
<想定結果>
Q4
----------------
KINGXXXXXX
BLAKEXXXXX
CLARKXXXXX

問題④の答え

SELECT RPAD(ename, 10, 'X') q4  
FROM emp;  

RPAD関数(とLPAD関数)は、以下のように書きます。

RPAD(文字列①,  長さ,  文字列②)
→「文字列①」の文字数が「長さ」になるよう、右側に「文字列②」を埋める
LPAD(文字列①,  長さ,  文字列②)
→「文字列①」の文字数が「長さ」になるよう、左側に「文字列②」を埋める
※どちらも、「文字列①」の文字数が「長さ」以上である場合は、文字数が「長さ」になるように文字列を切り捨てる

RPAD(ename, 10, 'X')と書くと、ename列の値が10文字になるように「X」という文字を埋める、という意味になります。
今回は「X」1文字でしたが、「abc」のように文字列で埋めることも可能です。

応用問題

ename列を、最初3文字を'X'に置き換えてq5列として表示してください。
<想定結果>
Q5
---------
xxxG
xxxKE
xxxRK

応用問題の答え

SELECT LPAD( SUBSTR(ename,4), LENGTH(ename), 'x' ) q5
FROM emp;

文字関数を複数使っているので、応用問題ということにしてみました。
まずSUBSTR(ename,4)は、enameの4文字目以降を切り取るという意味です。
次にLENGTH(ename)では、enameの文字数を求めます。
なので、LPAD( SUBSTR(ename,4), LENGTH(ename), 'x' )は、「enameの4文字目以降」を切り取り、「enameの文字数」になるまで左側に「X」を埋める、という意味になります。

おわりに

資格試験って実務では役に立たないことも多いですが、文字列操作は実務でもたくさん使うと思います。
なので、選択肢を選ぶだけではなく自分でSQLを書けるようにして、「資格は取ったけど役に立たないな・・・」なんてことにならないようにしていきたいです!