代码之家  ›  专栏  ›  技术社区  ›  Kyle B.

SQL IsNumeric返回True,但SQL报告“转换失败”

  •  13
  • Kyle B.  · 技术社区  · 17 年前

    Column1 (data type: varchar(50))
    --------
    11.6
    -1
    1,000
    10"    
    Non-Numeric String
    

    SELECT CASE
           WHEN IsNumeric(Replace(Column1, '"', '')) = 1 THEN Replace(Column1, '"', '')
           ELSE 0
       END AS NumericValue
    

    SQL正在报告:

    SELECT CASE
           WHEN IsNumeric(Replace(Column1, '"', '')) = 1 THEN cast(Replace(Column1, '"', '') AS float)
           ELSE 0
       END AS NumericValue
    

    我得到了:

    将数据类型varchar转换为float时出错。

    8 回复  |  直到 7 年前
        1
  •  11
  •   Quassnoi    17 年前

    CAST(REPLACE(column, ',', '.') AS FLOAT)
    

    SQL Server 输出用区域设置定义的十进制分隔符,但在中除了句点外不显示任何内容 CAST

        2
  •  5
  •   C B dkretz    8 年前

    首先将字符串转换为货币,然后将其转换为任何其他数字格式,因为货币类型总是给出一个真正的数字字符串。你永远不会看到错误。

    在你的查询中尝试以下内容,你就会知道我在说什么。两者都将返回2345.5656。Money数据类型四舍五入到小数点后4位,因此转换会导致四舍五进到小数点前4位。

    SELECT CAST('2,345.56556' as money), CAST('$2,345.56556' as money)
    

    Cast(以浮点数形式铸造('2344'表示货币)将完美运行或 cast(将'2344'转换为十进制(7,2))也可以使用。

    即使强制转换(cast('$2345.56556'作为货币)为int)也能完美地将其四舍五入到最接近的整数。

        3
  •  4
  •   brendan    17 年前
        4
  •  1
  •   dotjoe    17 年前

    当输入表达式的计算结果为有效的整数、浮点数、货币或十进制类型时,ISNUMERIC返回1;

        5
  •  1
  •   Lieven Keersmaekers    17 年前

    凯尔,

    我认为这解决了问题。问题在于ELSE子句将结果初始化为INTEGER。通过对FLOAT进行明确的类型转换并添加Quassnoi的建议,它似乎奏效了。

    DECLARE @MyTable TABLE (Column1 VARCHAR(50))
    INSERT INTO @MyTable VALUES('11.6')
    INSERT INTO @MyTable VALUES('-1')
    INSERT INTO @MyTable VALUES('1,000')
    INSERT INTO @MyTable VALUES('10"    ')
    INSERT INTO @MyTable VALUES('Non-Numeric String')
    
    SELECT CASE WHEN ISNUMERIC(REPLACE(Column1,'"','')) = 1 THEN REPLACE(REPLACE(Column1,'"',''), ',', '.') ELSE CAST(0 AS FLOAT) END
    FROM @MyTable
    


        6
  •  1
  •   Thiem Nguyen    14 年前

    IsNumeric(' ')

        7
  •  0
  •   user2284133    10 年前

    -- CURRENT ISNUMERIC RESULTS
    SELECT ISNUMERIC('11.6'); --1
    SELECT ISNUMERIC ('-1'); --1
    SELECT ISNUMERIC('1,000'); --1
    SELECT ISNUMERIC('10"'); --0
    SELECT ISNUMERIC('$10'); --1
    
    -- NEW ISNUMERIC RESULTS
    SELECT ISNUMERIC('11.6'+'e+00'); --1
    SELECT ISNUMERIC ('-1'+'e+00'); --1
    SELECT ISNUMERIC('1,000'+'e+00'); --0
    SELECT ISNUMERIC('10"'+'e+00'); --0
    SELECT ISNUMERIC('$10'+'e+00'); --0
    

        8
  •  0
  •   Hung Doan    10 年前

    我刚刚遇到这个问题。

    如果你不介意十进制长度的限制,你可以尝试这个解决方案。

    CONVERT(numeric, CONVERT(money, '.')) 
    

    1. 它是 支持 在……里面 或以上。
    2. 金钱 .