SQL IsNumeric not working

前端 未结 11 800
迷失自我
迷失自我 2021-01-02 19:47

The reserve column is a varchar, to perform sums on it I want to cast it to a deciaml. But the SQL below gives me an error

select
cast(Reserve as decimal)
fr         


        
相关标签:
11条回答
  • 2021-01-02 20:12

    isnumeric is not 100% reliable in SQL - see this question Why does ISNUMERIC('.') return 1?

    I would guess that you have value in the reserve column that passes the isnumeric test but will not cast to decimal.

    0 讨论(0)
  • 2021-01-02 20:13

    Gosh, nobody seems to have explained this correctly. SQL is a descriptive language. It does not specify the order of operations.

    The problem that you are (well, were) having is that the where does not do the filtering before the conversion takes place. Order of operations, though, is guaranteed for a case statement. So, the following will work:

    select cast(case when isnumeric(Reserve) = 1 then Reserve end as decimal)
    from MyReserves
    where isnumeric(Reserve ) = 1 and MyReserves is not null
    

    The issue has nothing to do with the particular numeric format you are converting to or with the isnumeric() function. It is simply that the ordering of operations is not guaranteed.

    0 讨论(0)
  • 2021-01-02 20:17

    See here: CAST and IsNumeric

    Try this:

    WHERE IsNumeric(Reserve + '.0e0') = 1 AND reserve IS NOT NULL
    

    UPDATE

    Default of decimal is (18,0), so

    declare @i nvarchar(100)='12121212121211212122121'--length is>18 
    SELECT ISNUMERIC(@i) --gives 1
    SELECT CAST(@i as decimal)--throws an error
    
    0 讨论(0)
  • 2021-01-02 20:17

    Just a heads up on isnumeric; if the string contains some numbers and an 'E' followed by some numbers, this is viewed as an exponent. Example, select isnumeric('123E0') returns 1.

    0 讨论(0)
  • 2021-01-02 20:19

    I had this same problem and it turned out to be scientific notation such as '1.72918E-13' To find this just do where Reserve LIKE '%E%'. Try bypassing these and see if it works. You'll have to write code to convert these to something usable or reformat your source file so it doesn't store any numbers using scientific notation.

    0 讨论(0)
提交回复
热议问题