web-dev-qa-db-ja.com

テキストと数値のSQLBETWEEN

BETWEENWHERE句で使用され、2つの値の間のデータ範囲を選択します。
範囲のエンドポイントが除外されているかどうかが正しければ、DBMS固有です。
以下で理解できないこと:
値のテーブルがあり、次のクエリを実行する場合:

SELECT food_name 
    FROM health_foods 
    WHERE calories BETWEEN 33 AND 135;`  

クエリは結果として行を返します含むカロリー= 33およびカロリー= 135(つまり、範囲のエンドポイントは含まれる)。

しかし、私がそうするなら:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'O';

私はnotOで始まるfood_nameの行を取得します。つまり範囲の終わりは除外です。
クエリが期待どおりに機能するようにするには、次のように入力します。

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'P';`   

私の質問は、数字とテキストデータのBETWEENになぜそのような違いがあるのですか?

13
Cratylus

Betweenは、数字と文字列でまったく同じように動作します。 2つのエンドポイントare含まれています。これはANSI規格の一部であるため、すべてのSQLダイアレクトがどのように機能するかを示しています。

表現:

where num between 33 and 135

numが135の場合は一致します。numberが135.00001の場合は一致しません。

同様に、式:

where food_name BETWEEN 'G' AND 'O'

'O'と一致しますが、 'O'で始まる他の文字列とは一致しません。

簡単な応急修理は「〜」を使用することです。これは最大の7ビットASCII値を持っているので、英語のアプリケーションの場合、通常はうまく機能します。

where food_name between 'G' and 'O~'

他にもいろいろなことができます。ここに2つのアイデアがあります:

where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'

ただし、重要な点は、betweenがデータ型に関係なく同じように機能することです。

20
Gordon Linoff

「オレンジ」と「O」の例を見てみましょう。文字列「オレンジ」は明らかに文字列「O」と等しくなく、長いほど大きくなければならず、小さくはなりません。

ただし、「オレンジ」<「OZZZZZZZZZZZZZZ」を実行することはできます。

5
SteveP

REGEXでこれを試してください

  WHERE  food_name REGEXP '^[G-O]';

これにより、Gで始まるすべてのfood_nameが、Oで始まる人まで与えられます。

デモはこちら

2
echo_Me