質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

2回答

573閲覧

Oracle Bronzeの問題

reirei0724

総合スコア6

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/07/31 09:49

編集2019/07/31 13:36

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)」が正解」の一文が矛盾していることです。

ご意見お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

あれこれ悩む前にやってみましょう。

SQL

1select 2 prodcd 3, rpad(substr(prodcd, instr(prodcd, '-')), length(prodcd) - instr(prodcd, '-'), 'x') A 4, rpad(substr(prodcd, instr(prodcd, '-')), length(prodcd), 'x') B 5, lpad(substr(prodcd, instr(prodcd, '-')), length(prodcd) - instr(prodcd, '-'), 'x') C 6, lpad(substr(prodcd, instr(prodcd, '-')), length(prodcd), 'x') D 7from product
PRODCDABCD
A1-Cc01-001-Cc01-00-Cc01-001xx-Cc01-00xx-Cc01-001
A1-DE01-100-DE01-10-DE01-100xx-DE01-10xx-DE01-100

投稿2019/07/31 11:39

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reirei0724

2019/07/31 13:39 編集

実行もし、答えがDであることもわかります。 知りたいのは、 解説の、 「選択肢Cの第2引数は、②で抜き出した文字列の長さから1を引いた値」 というのが誤植かどうか、です。
KOZ6.0

2019/07/31 12:07

議論するもなにも C の値を見れば結果が出ているのでは?
reirei0724

2019/07/31 13:40 編集

結果はたまたま一致し、文字数が8となりますが、途中経過の解説からは9-1=8、と読み取れ、正しくは、11-3=8 だと思う、という話です。私が知りたいのは結果ではありません。 実際の試験では、pcを叩くことはできないので、実行結果さえわかればいいとは思っておりませんので、正確な実行途中経過、解説内容が本当に正しいのか?がわからないのであれば、質問の意図とは違ったコメントはお控えください。
KOZ6.0

2019/07/31 12:42

11-3=8 は 9-1=8 と同じって書いているように思います。 「引いた値に等しくなっています。」というのがわかりやすい書き方かな、とも思いますが、別に間違っているとは思いません。
reirei0724

2019/07/31 13:44 編集

? もう一回私の質問を全部、隅々まで理解し、熟読してもらえますか? 「引いた値に等しくなっています。」というのがわかりやすい書き方かな →言ってることがカケラもわかりません。。。
reirei0724

2019/07/31 12:48

正解はDということは納得いきますが、あくまで納得できないのは、解説の「選択肢Cの第2引数は、②で抜き出した文字列の長さから1を引いた値」の一文と、その直後の「戻す長さは元の部品コード番号の長さなので、選択肢Dの「length(prodcd)」が正解」の一文が矛盾していることです。
reirei0724

2019/07/31 13:41 編集

わからないなら、もういいです! コメントはお控えください!
KOZ6.0

2019/07/31 12:54

うーん、間違って回答に書いてしまいました。 要はとらえ方の問題かと思います。
reirei0724

2019/07/31 13:45 編集

いずれにしろ、最初から最後まで、質問の回答にはなっていないため、ベストアンサーには出来ません!
guest

0

選択肢Cの第2引数(戻す長さ)は、 11-3=8
②で抜き出した文字列の長さから1を引いた値 9-1=8
になっています。(に等しくなっています。)
のように読み取れるので、間違ってはいないと思います。

投稿2019/07/31 12:50

編集2019/07/31 13:16
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reirei0724

2019/07/31 13:26

捉え方の問題なんかじゃありません! 私が言いたいのは、 選択肢CでもDでも、「②で抜き出した文字列」は、第2引数の計算には使わないと思う、ということです。9-1の計算式が出てくること自体が間違いであり、正しい計算式は11-3だと思います。本の解説は明らかに誤っていると思います。 ちなみに。Oracleプラチナもってる人にも聞いてみましたが、本が誤植だと言っています。
reirei0724

2019/07/31 13:33

聴こえていないようなので再度お伝えします。。。 納得できないのは、解説の「選択肢Cの第2引数は、②で抜き出した文字列の長さから1を引いた値」の一文と、その直後の「戻す長さは元の部品コード番号の長さなので、選択肢Dの「length(prodcd)」が正解」の一文が矛盾していることです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問