0

我有一个名为 Buttons 的表。按钮表我有列 button_number 。表包含 100 多条记录。现在我必须选择一个介于 10 到 50 之间的按钮编号。当我使用以下查询时,它不会返回零行。

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 的回答中提到的,更好的选择是将 button_number 的类型更改为整数类型(如果可能)。这将有几个优点:

  • 在列中输入非整数值是不可能的
  • 然后,您将能够对列应用整数索引。当表包含大量行时,这将大大提高查询速度。
于 2012-04-04T07:02:38.023 回答
2

如果是这样,解决方法是什么?

其他答案告诉您将列投射到int查询中。如果列中只有整数,这对你有用。如果是这种情况,您应该将列的数据类型更改为button_numberint这样您就不会冒险在其中存在会破坏您的查询的字符值。

于 2012-04-04T07:06:49.903 回答
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 回答
0

根据您的数据库类型和版本,但在 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

在 postgreSQL 数据库中,您可以像这样转换:

select * from Buttons where 
    button_number::int >= 10 and convert(integer, button_number) <= 50
于 2020-09-13T11:21:46.557 回答