0

ボタンというテーブルがあります。ボタンテーブルには、列 button_number があります。テーブルに 100 を超えるレコードが含まれています。ここで、10 から 50 までのボタン番号を選択する必要があります。この次のクエリを使用すると、0 行が返されません。

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

クエリの問題は何ですか。別の列(データ型はint)で同じクエリを使用すると、正常に機能します。列のデータ型が問題ですか? もしそうなら、これに対する修正は何ですか?

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

4

5 に答える 5

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's answer で述べたように、より良い代替手段は、button_number の型を整数型に変更することです (可能な場合)。これにはいくつかの利点があります。

  • 列に整数以外の値を入力する可能性はありません
  • その後、列に整数インデックスを適用できます。これにより、テーブルに多数の行が含まれている場合、クエリの速度が大幅に向上します。
于 2012-04-04T07:02:38.023 に答える
2

もしそうなら、これに対する修正は何ですか?

int他の回答では、クエリで列をキャストするように指示されています。列に整数しかない場合は、これでうまくいきます。その場合は、列のデータ型をに変更して、クエリを壊す文字値が含まれるリスクを避ける必要がありますbutton_numberint

于 2012-04-04T07:06:49.903 に答える
0

DB タイプとバージョンによって異なりますが、MySQL ではデータ型として SIGNED または UNSIGNED を使用する必要がある場合があります。

SELECT * FROM Buttons 
WHERE CONVERT(SIGNED, button_number) >= 10 
AND CONVERT(SIGNED, button_number) <= 50
于 2012-04-04T07:12:22.127 に答える
0

以下のようにクエリを変更します

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

ただし、列「button_number」のすべての値に文字がないことを確認してください

于 2012-04-04T07:07:38.790 に答える