【问题标题】:sql where condition for int but column type is Varcharsql where int 的条件但列类型是 Varchar
【发布时间】:2012-04-17 21:04:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您使用的是什么类型的数据库?为您的数据库添加正确的标签。
  • 如果您通过缩进 4 个空格(或点击{} 按钮)来标记代码,您将获得正确的语法突出显示。比仅仅让它变得大胆要好得多。
  • 是的,我知道..但忘了这样做..感谢您的更新..

标签: sql sqldatatypes type-conversion


【解决方案1】:

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,这样您就不会冒险在其中出现会破坏查询的字符值。

    【讨论】:

      【解决方案3】:

      修改您的查询,如下所示

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-31
            • 1970-01-01
            • 2010-10-31
            • 2012-09-20
            • 1970-01-01
            相关资源
            最近更新 更多