【问题标题】:Checking for numbers in char field检查 char 字段中的数字
【发布时间】:2016-09-22 19:43:15
【问题描述】:

我正在研究一个数据库,其中一些亮点决定将数字和字母(没有充分理由)存储在 char 字段中是个好主意。

现在我需要选择数字低于某个值的位置,但由于某些记录中存在字母,显然会出错。

我已经尝试了以下

select column1
from table1
where ISNUMERIC(column1)=1
AND column1<=16

但是我得到以下错误

将 varchar 值“5.00”转换为数据时转换失败 输入整数。

现在对我来说这看起来像一个数字,为​​什么它不能转换它?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    CAST 列,如果它是 NUMERIC

    select column1
    from table1
    where ISNUMERIC(column1)=1
    AND CAST(column1 AS DECIMAL(18,2)) <= 16.0
    

    【讨论】:

      【解决方案2】:

      这是 SQL Server 中的一个已知问题。 SQL Server 2012+ 中正确的解决方案是使用try_convert():

      select column1
      from table1
      where try_convert(int, column1) <= 16;
      

      您的查询的问题在于 SQL Server(与所有其他数据库一样)不保证 where 子句中表达式的计算顺序。请注意,您不能通过使用子查询或 CTE 来修复您的版本,因为 SQL Server 保留在编译和执行查询时重新安排操作的权利。

      在早期版本中,您基本上可以使用 case 来做同样的事情:

      select colum1
      from table1
      where (case when isnumeric(column1) = 0
                  then 999
                  else convert(int, column1)
             end) <= 16
      

      注意:这两个都假设字符串值是一个整数。如果它可以是十进制数,则使用适当的类型进行转换。

      【讨论】:

      • 这个 case 语句给了我一个语法错误“Incorrect syntax near end, expecting AND,OR or THEN”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多