sql其中int的条件但列类型是Varchar

时间:2012-04-04 06:59:23

标签: sql sqldatatypes type-conversion

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

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

查询中出现了什么问题。如果我使用不同列的相同查询(数据类型为int),那么它工作正常。问题是因为列的数据类型?如果是这样,对此有什么解决方法?

注意:button_number列数据类型为Varchar。

5 个答案:

答案 0 :(得分: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的类型更改为整数类型(如果可能)。这有几个好处:

  • 在列
  • 中输入非整数值是不可能的
  • 然后,您就可以将整数索引应用于该列。当表包含大量行时,这将大大提高查询的速度。

答案 1 :(得分:2)

  

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

其他答案告诉您将列转换为查询中的int。如果列中只有整数,那将对你有用。如果是这种情况,您应该将列button_number的数据类型更改为int,这样您就不会有在其中包含会破坏查询的字符值的风险。

答案 2 :(得分:0)

修改您的查询,如下所示

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

但请确保列“button_number”的所有值都没有任何字符

答案 3 :(得分:0)

根据您的数据库类型和版本,但在MySQL中,您可能需要使用SIGNED或UNSIGNED作为您的数据类型:

SELECT * FROM Buttons 
WHERE CONVERT(SIGNED, button_number) >= 10 
AND CONVERT(SIGNED, button_number) <= 50

答案 4 :(得分:0)

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

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