2012-04-04 18 views
0

私はButtonsというテーブルを持っています。ボタンテーブル私は列button_numberを持っています。表には100を超えるレコードが含まれています。今私は10から50の間のボタン番号を選択する必要があります。私はこの次のクエリを使用するとゼロ行を返していない。sqlここで、int型のカラム型はVarcharです

select * from Buttons where button_number >= '10' and button_number <='50' 

クエリの問題点は何ですか。私は別の列(データ型int)で同じクエリを使用する場合、それは正常に動作しています。列のデータ型のために問題はありますか?もしそうなら、これに対する修正は何ですか?

注:button_number列のデータ型はVarcharです。

+0

どのようなタイプのDBを使用していますか? DBの正しいタグを追加してください。 – barsju

+0

4つのスペースをインデントしてコードをマークアップするか(または '{}'ボタンを押す)、適切な構文ハイライトが得られます。それを大胆にするよりはるかに良い。 –

+0

うん、私は知っていた..しかし、それを忘れて..あなたの更新のおかげで.. – Arung

答えて

4

button_numberはvarcharで、整数のスタイル比較を実行しようとしています。 button_number列を整数にキャストする必要があります。

select * from Buttons where 
    convert(integer, button_number) >= 10 and convert(integer, button_number) <= 50 

編集

それはWHERE句を適用する前に、整数にすべてのbutton_numberを変換する必要があるので、上記のクエリはテーブルスキャンが必要になります。これは100行の場合は問題ではありませんが、多数の場合は問題になります。

Mikael Erikssonの答えで述べたように、より良い方法はbutton_numberのタイプを整数型(可能な場合)に変更することです。これにはいくつかの利点を持っているでしょう:

  • あなたは、列に整数インデックスを適用することができるだろう列
  • に非整数値を入力するチャンスはないだろう。テーブルに多数の行が含まれている場合、クエリの速度が大幅に向上します。
2

これはどうしたらいいですか?

他の答えでは、クエリの列をintにキャストするよう指示されています。列に整数だけがあれば、それはうまくいくでしょう。その場合は、列button_numberのデータ型をintに変更する必要があります。そのため、そこに文字の値が含まれているとクエリが壊れる危険がありません。

0

かもしれません

select * from Buttons where cast(button_number as int) >= 10 and cast(button_number as int) <=50 

以下のようなあなたのクエリを変更するが、列のすべての値が「button_numberは」あなたのDBの種類やバージョンによって任意のcharcters

0

を持っていけないが、MySQLであなたことを確認してください

SELECT * FROM Buttons 
WHERE CONVERT(SIGNED, button_number) >= 10 
AND CONVERT(SIGNED, button_number) <= 50 
関連する問題