PRODUCT表のPRODCD列の部品コード番号は、以下の形式で格納されている。
PRODCD
A1-Cc01-001
A1-DE01-100
…以下省略…
以下の形式で、部品コード番号の先頭番号を隠したレポートを作成するSQL文として正しいものを選びなさい。
xx-Cc01-001
A. select rpad(substr(prodcm, instr(prodcd, '-')), length(prodcd) - instr(prodcd, '-'), 'x') from product
B. select rpad(substr(prodcd, instr(prodcm, '-')), length(prodcd), 'x') from product
C. select lpad(substr(prodcd, instr(prodcd, '-')), length(prodcd) - instr(prodcd, '-'), 'x') from product
D. select lpad(substr(prodcd, instr(prodcd, '-')), length(prodcd), 'x') from product
で、正解はDなのはわかるのですが、
解説の一部が理解できません。
黒本の解説
文字関数(特にINSTR、LPAD、SUBSTR)に関する問題です。
まず、選択肢Aを調べます。ネストの内側から外側に関数を評価していきます。
①instr(prodcd, '-')
部品コード番号の最初のハイフン「-」の位置を調べています。
〈例: A1-Cc01-001〉instr(prodcd, '-')→3
②substr(prodcd, instr(prodcd, '-'))
部品コード番号の3文字目(最初のハイフン)以降の文字列を抜き出します。
〈例: A1-Cc01-001〉substr(prodcd, instr(prodcd, '-')) → -Cc01-001
③rpadを使っていますが、rpadは右に埋め込むので誤りです。同様に、選択肢Bも誤りです。左に埋め込むlpadが正しいので、選択肢Cを調べます。
④「lpad(文字列, n [,文字])」は、文字列の左側に「文字」を埋め込んで長さ「n」にして戻します。**選択肢Cの第2引数(戻す長さ)は、②で抜き出した文字列の長さから1を引いた値になっています。**したがって、選択肢Cでは、埋め込まず逆に最後の1文字を切り捨てて戻します。このため、選択肢Cは誤りです。戻す長さは元の部品コード番号の長さなので、選択肢Dの「length(prodcd)」が正解です。
とあるのですが、
選択肢AとBは、rpadなので違うことは、わかります。
選択肢Cの第2引数は、
②で抜き出した文字列の長さ(-Cc01-001 だから9文字)から1(instr(prodcd, '-')だから、-Cc01-001の1文字目)を引いた値=8 となり、xで埋める前にすでに -Cc01-001 の9文字あるため、お尻の1文字を切り捨てて戻す、というのも理解できる。
だけど、選択肢Dの第2引数も、②で抜き出した文字列の長さ(-Cc01-001 だから9文字)になるから、解説の最後の、「戻す長さは元の部品コード番号の長さなので」というのが、理解できません。
それとも、選択肢Cの第2引数の理解が間違ってるのか。。。
選択肢Cの第2引数は、
②で抜き出した文字列の長さから1を引いた値
というのが誤植な気がします。
選択肢Cの第2引数は、
length(prodcd) - instr(prodcd, '-')
で、prodcdは、A1-Cc01-001だから、
length(prodcd) - instr(prodcd, '-')=
11-3=8
というのなら、理解できます。
正解はDということは納得いきますが、あくまで納得できないのは、解説の「選択肢Cの第2引数は、②で抜き出した文字列の長さから1を引いた値」の一文と、その直後の「戻す長さは元の部品コード番号の長さなので、選択肢Dの「length(prodcd)」が正解」の一文が矛盾していることです。
ご意見お願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/31 13:39 編集
2019/07/31 12:07
2019/07/31 13:40 編集
2019/07/31 12:42
2019/07/31 13:44 編集
2019/07/31 12:48
2019/07/31 13:41 編集
2019/07/31 12:54
2019/07/31 13:45 編集