0

easy_drinksという名前のこのテーブルを考えてみましょう。

+------------------+
| drink_name       |
+------------------+
| Kiss on the Lips |
| Hot Gold         |
| Lone Tree        |
| Greyhound        |
| Indian Summer    |
| Bull Frog        |
| Soda and It      |
| Blackthorn       |
| Blue Moon        |
| Oh My Gosh       |
| Lime Fizz        |
+------------------+

そのようなクエリ、

 select drink_name from easy_drinks where drink_name BETWEEN 'G' and 'O';

結果は

+------------------+
| drink_name       |
+------------------+
| Kiss on the Lips |
| Hot Gold         |
| Lone Tree        |
| Greyhound        |
| Indian Summer    |
| Lime Fizz        |
+------------------+

で始まるドリンク名Oは結果に含まれません。しかし、マニュアルページによると

expr BETWEEN min AND max

expr が min 以上で expr がmax 以下の場合、BETWEEN は 1 を返し、それ以外の場合は 0 を返します。 expr が min 以上で expr が max 以下の場合、BETWEEN > を返します。 1、それ以外の場合は 0 を返します。

クエリでこのような結果が得られるのはなぜですか?

Timestamp と Date の動作を説明する質問をしてきました。この場合の理由は何ですか?

4

2 に答える 2

2

tl;dr

文字列に BETWEEN を使用しないでください

ここで、drink_name >= 'G' およびdrink_name < 'P';

なんで?

O は、列に一致するように末尾のスペースで効果的に展開されます。そう

'O                  '

前です

'Oh My Gosh'

だからあなたが必要だろう

where drink_name BETWEEN 'G' and 'OZ';

と呼ばれる飲み物がある場合Ozymandias、これは機能しません。そう:

where drink_name BETWEEN 'G' and 'OZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ';

Pしかし、コールされた飲み物がなく、多くのスペースがないと安全に想定できますか?
これは理解できません。

select drink_name from easy_drinks
where drink_name BETWEEN 'G' and 'P';

明らかな選択は、 LEFTを使用して最初の文字のみを比較することです。

select drink_name from easy_drinks
where LEFT(drink_name, 1) BETWEEN 'G' and 'O';

ただし、これにより、drink_name のインデックスを使用できなくなります。

于 2013-05-23T09:33:26.207 に答える