Re: 問題18425について

この質問の投稿一覧へ

なし Re: 問題18425について

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-9-17 10:02 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
うーん、ちょっと解説がよわいのかなぁ…

以下の公式情報を見てください。
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のパターン
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

次に、expr1 <= expr3のパターン
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 ←ここ
「LE(大文字LE、ASCIIコード10進数表記で76+69=145)」以下のものが表示されています。
※「LED(大文字LED、ASCIIコード10進数表記で76+69+68=213)」だとLEより大きくなるので含まれない。LIKE演算子とは異なるので注意してください。

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

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

投稿ツリー

  >フォーラム検索へ


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