レス
元トピ次レス
タイトル
Re: 問題18425について
フォーラム
最強WEB問題集Oracle Master 11g Bronze SQL基礎
投稿ユーザ(投稿日)
(2015/9/17)
本文
うーん、ちょっと解説がよわいのかなぁ… (^^;

以下の公式情報を見てください。
Oracle® Database SQL言語リファレンス 11g リリース2 (11.2) B56299-07:BETWEEN条件
http://docs.oracle.com/cd/E16338_01/server.112/b56299/conditions011.htm

真ん中あたりの説明を確認します。

-----引用(始)-----

さらに次の式の値について考えてみます。

expr1 BETWEEN expr2 AND expr3
この式の値は次のブール式の値と同じです。

expr2 <= expr1 AND expr1 <= expr3

-----引用(終)-----

expr1 BETWEEN expr2 AND expr3 は「expr1がexpr2とexpr3の間のもの」ではなく「expr1がexpr2以上、かつ、expr1がexpr3以下のもの」です。

標準的なSQLなので、sqliteで確認してみました。

まず、expr1 >= expr2のパターン
[code]
sqlite> select prod_name from products where upper(prod_name) >= 'H' order by upper(prod_name);
HighPower_LED_ハンディライト2 ←ここ
Lantern ←ここ
led light
LED_サイクルライト
LEDライト
ledランタン
Light_LED_ハンディライト(6球)
Silver LED_ライト
Watch1
watch2
watch3
[/code]

次に、expr1 <= expr3のパターン
[code]
sqlite> select prod_name from products where upper(prod_name) <= 'LE' order by upper(prod_name);
(Wide)LEDシーリングライト
BEST HITS_60's
BEST HITS_70's
BEST HITS_70's DANCE
BEST HITS_80's
BEST HITS_80's DANCE
cyclelight
HighPower_LED_ハンディライト2 ←ここ
Lantern ←ここ
[/code]
「LE(大文字LE、ASCIIコード10進数表記で76+69=145)」以下のものが表示されています。
※「LED(大文字LED、ASCIIコード10進数表記で76+69+68=213)」だとLEより大きくなるので含まれない。LIKE演算子とは異なるので注意してください。

検証には以下のSQLを使ってみるといいですよ
[code]
SELECT 'LE' <= 'LE';
SELECT 'LED' <= 'LE';
SELECT 'LED' LIKE 'LE';
SELECT 'LED' LIKE 'LE%';
[/code]

なので、この結果のAND(両方の結果に存在するもの)は
[code]
sqlite> select prod_name from products where upper(prod_name) between 'H' and 'LE';
HighPower_LED_ハンディライト2
Lantern
[/code]
になるということです。

レス一覧

元トピ次レス


Ping-tモバイルTOP

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