betweenに関する。

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2020-5-15 16:45
accompany  新米   投稿数: 1
次のSQL文を実行して表示される製品名として正しいものはどれですか(該当するものを全て選択して下さい)。

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

Lantern
led light
(Wide)LEDシーリングライト
HighPower_LED_ハンディライト2
LEDライト

なんで答えが1,4番だけなのかよくわかりません。LEDライトはできないのかな。。・?
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2020-5-15 21:57 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
まず大事なのは、ここでの問題は「BETWEEN」であって「LIKE」ではない、ということです。
 SELECT prod_name
 FROM products
 WHERE UPPER(prod_name) BETWEEN 'H' AND 'LE';
条件はUPPER(prod_name)により、prod_nameの文字列がすべて大文字で比較されます。次にBETWEENですが、BETWEENはざっくりいうと「大小比較」なのです。わかりやすく言うと「BETWEEN 100 AND 200」って言ったときに「210」は含まない、ということです。

ここが大丈夫だったら話はかんたんなのです。

引用:
Lantern
led light
(Wide)LEDシーリングライト
HighPower_LED_ハンディライト2
LEDライト

なんで答えが1,4番だけなのかよくわかりません。LEDライトはできないのかな。。・?
全部大文字にすると
LANTERN
LED LIGHT
(WIDE)LEDシーリングライト
HIGHPOWER_LED_ハンディライト2
LEDライト
ですよね。並び替えると
(WIDE)LEDシーリングライト
HIGHPOWER_LED_ハンディライト2
LANTERN
LED LIGHT
LEDライト
となります。ここで大小比較になりますが
- (とHだと「H」のほうが大きい→「(WIDE)LEDシーリングライト」はBETWEENの範囲に含まれない
- HとHIだと「Hのほうが小さい」→「HIGHPOWER_LED_ハンディライト2」はBETWEENの範囲に含まれる
- LAとLEだと「LE」のほうが大きい→「LANTERN」はBETWEENの範囲に含まれる
- LEとLEDだと「LED」のほうが大きい→「LED LIGHT」や「LEDライト」ははBETWEENの範囲に含まれない
のです。

ここは実際にSQL使って確認すると、Oracleが文字の大小をどう判断しているのかがわかります。
# sqlplus pingt/oracle@XE

SQL*Plus: Release 11.2.0.2.0 Production on 金 5月 15 21:52:56 2020

Copyright (c) 1982, 2011, Oracle.  All rights reserved.



Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> SELECT CASE
WHEN 'H' > '(' THEN 'LOWER'
WHEN 'H' < '(' THEN 'HIGHER'
END RESULT
FROM DUAL;  2    3    4    5

RESULT
------
LOWER ← 「H」より「(」は小さい

SQL> SELECT CASE
WHEN 'H' > 'HI' THEN 'LOWER'
WHEN 'H' < 'HI' THEN 'HIGHER'
END RESULT
FROM DUAL;  2    3    4    5

RESULT
------
HIGHER ← 「H」より「HI」は大きい

SQL> SELECT CASE
WHEN 'LE' > 'HI' THEN 'LOWER'
WHEN 'LE' < 'HI' THEN 'HIGHER'
END RESULT
FROM DUAL;  2    3    4    5

RESULT
------
LOWER ← 「LE」より「HI」は小さい

SQL> SELECT CASE
WHEN 'LE' > 'LANTERN' THEN 'LOWER'
WHEN 'LE' < 'LANTERN' THEN 'HIGHER'
END RESULT
FROM DUAL;  2    3    4    5

RESULT
------
LOWER ← 「LE」より「LANTERN」は小さい

SQL> SELECT CASE
WHEN 'LE' > 'LED' THEN 'LOWER'
WHEN 'LE' < 'LED' THEN 'HIGHER'
END RESULT
FROM DUAL;  2    3    4    5

RESULT
------
HIGHER ← 「LE」より「LED」は大きい
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-10-27 16:48 | 最終変更
ruttey  新米   投稿数: 3
すみませんが、下記について教えてください。
>LEとLEDだと「LED」のほうが大きい→「LED LIGHT」や「LEDライト」はBETWEENの範囲に含まれない

どうしてこの場合、2文字と3文字の比較になるのですか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-10-27 20:06
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
>LEとLEDだと「LED」のほうが大きい→「LED LIGHT」や「LEDライト」はBETWEENの範囲に含まれない

どうしてこの場合、2文字と3文字の比較になるのですか?
えっ、だって問題のSQLって
引用:
 SELECT prod_name
 FROM products
 WHERE UPPER(prod_name) BETWEEN 'H' AND 'LE';
ですから、「LE」と「LED」を比べてどうなるかって重要じゃないですか?
(LEよりLEDの方が大きければBETWEENの範囲に入らない、という確認)

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.