我有一个名为Buttons的表。按钮表我有列button_number。表包含100多条记录。现在我必须选择10到50之间的按钮数。当我使用以下查询时它不会返回零行。
select * from Buttons where button_number >= '10' and button_number <='50'
查询中出现了什么问题。如果我使用不同列的相同查询(数据类型为int),那么它工作正常。问题是因为列的数据类型?如果是这样,对此有什么解决方法?
注意:button_number列数据类型为Varchar。
答案 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