助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26844
問題を開く
次のSQL文を実行して表示される製品名として正しいものはどれですか(該当するものを全て選択して下さい)。

 SELECT prod_name
 FROM products
 WHERE UPPER(prod_name) BETWEEN 'H' AND 'LE';

正解

HighPower_LED_ハンディライト2

Lantern

解説

BETWEEN演算子の下限値、上限値に文字リテラルが指定された場合は、指定された文字列の文字コードの範囲で検索が行われます。
設問の場合は、UPPER(prod_name)で全て大文字に変換された商品名の頭文字が「H」で始まるものから、「LE」という2文字の文字コードの範囲までが検索されます。

以上より、
・HighPower_LED_ハンディライト2
・Lantern
が正解となります。

設問のSELECT文の実行結果は次のようになります。


SQLを表示
SELECT prod_name
FROM products
WHERE UPPER(prod_name) BETWEEN 'H' AND 'LE';


ちなみに、このSQL文でUPPER関数を使わないと、商品名「Lantern」はヒットしません。2文字目の小文字の「a」は大文字の全アルファベットより文字コードが大きいからです。


SQLを表示
SELECT prod_name
FROM products
WHERE prod_name BETWEEN 'H' AND 'LE';


UPPER関数で大文字「LANTERN」にした場合は、最初の2文字「LA」の組合せの文字コードが、検索の上限値の「LE」より小さいため、設問のように検索でヒットします。

参考

指定された範囲の値を検索する場合、「A以上」、「B以下」という2つの条件をAND演算子で指定する方法もありますが、BETWEEN演算子で指定された範囲の値を検索することもできます。
BETWEEN演算子の指定方法は次のとおりです。

 BETWEEN 下限値 AND 上限値

BETWEEN演算子では指定された下限値以上、上限値以下の値を検索します(下限値、上限値も検索範囲に含まれる)。
以下の3つのSQLは同じ意味を表します。

 例) SELECT employee_name, salary FROM employees WHERE salary BETWEEN 300000 AND 600000;
 例) SELECT employee_name, salary FROM employees WHERE salary >= 300000 AND salary <= 600000;
 例) SELECT employee_name, salary FROM employees WHERE salary <= 600000 AND salary >= 300000;

※BETWEEN演算子で下限値と上限値の位置を逆にすると、1件も検索できませんので注意して下さい。

下限値、上限値には数値の他、文字リテラルや日付リテラルを指定することもできます。文字リテラルを指定した場合は文字コードの範囲を、日付リテラルの場合は期間を検索します。
なお、文字リテラルや日付リテラルは一重引用符(')で囲まなければなりません。

 例)SELECT order_id, order_date FROM ORDERS WHERE order_date BETWEEN '2010-04-01' AND '2011-03-31';

また、BETWEEN演算子はNOT演算子と組み合せて使用することもできます。

 NOT BETWEEN 下限値 AND 上限値

NOT演算子と組合せて使用する場合は下限値よりも小さい、または上限値よりも大きい値を検索します。下限値、上限値は検索結果に含まれませんので注意しましょう。

 
 
SQLを表示
SELECT employee_name, salary
FROM employees
WHERE salary NOT BETWEEN 300000 AND 600000;


上記ではSALARY列が300000より小さいか、600000より大きい行が検索されます。300000、600000の行は検索結果に含まれません。つまり以下のSQLと同じです。

 例) SELECT employee_name, salary FROM employees WHERE salary < 300000 OR salary > 600000;
 例) SELECT employee_name, salary FROM employees WHERE salary > 600000 OR salary < 300000;
上に戻る

なぜ答えのLEDライトとled lightは含まれないのでしょうか?

投稿日 2022/11/27

s shimogawa 公開日 2022/11/27
解説にUPPER関数を使えば、商品名「Lantern」が「LANTERN」になって「LA」が
該当の範囲内になるということについては理解しました。
「LEDライト」と「led light」もUPPER関数を使うことで「LEDライト」、「LED LIGHT」となり
BETWEEN句の'LE'の範囲(先頭2文字のLEに該当して)に該当するのではないでしょうか?
ご教示いただけないでしょうか。

2022/11/28 15:45

恐らくですが、
数字・・・数字~数字
日付・・・日付~日付
文字・・・数字(文字)~数字(文字)
として範囲として認識しているのではないでしょうか。
例えばASCIIコードで10進数で表すと、
Hは104,Lは108,Eは101,Aは97として、設問の
H(104)~LE(108 101)の範囲の中にLAは(108 97)となるので範囲内、
LEDは108 101 100となるので範囲外という認識でいかがでしょうか。


コメント

h hikichi68

2022/11/28 16:36

日付も中では数値として使っていましたね。 日付・・・数値(日付)~数値(日付)と訂正させてください。

s shimogawa

2022/11/28 21:33

ご教示ありがとうございます。 文字を数値(ASCⅡコード)として考える必要があるのですね。 よく理解できました。

I Imaimairryo

2023/06/17 17:35

"LED"の文字列を数値(ASCⅡコード)に変えると 範囲外になると説明されましたが その場合なぜ"Lantern"の評価対象文字列が"La"の頭2文字のみで "LEDライト"の評価対象文字列が"LED"の頭3文字になるのですか?

k kentootsu

2023/07/21 09:55

"LEDライト"・・・"LE"と"LF"の間 "Lantern"・・・"LZ"と"Lb"の間 "La"はその時点で範囲外だとわかりますが、 "LE"は続く文字がなければ対象内、あれば対象外になります。 ("LE"は〇、"LED"は✕) 評価対象文字列が変わっている訳ではありません。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?