isnumeric函数不提供预期的结果

时间:2015-01-30 17:45:25

标签: sql sql-server sql-server-2008

dsply_valvarchar(2000)字段。当我运行下面的查询时,isnumeric列的值为0,即使这些值看起来是数字。我正在尝试对此列执行简单的计算,但当我尝试转换为decimalfloat时,我最终收到转换错误。正如您在15.2值中看到的那样,有些实际上会以数字形式返回。

我将dsply_val导出到Excel,并确认没有任何字母或任何异常。

我还有什么办法可以尝试这个或者我做得不好?

SELECT obsv_cd_name, 
       dsply_val,
       ISNUMERIC(dsply_val),
       ISNUMERIC(dsply_val + 'e0'),
       ISNUMERIC(rtrim(Ltrim(dsply_val)))
FROM smsmir.mir_sr_obsv
where obsv_cd_name = 'WBC' 
and sort_dtime >= '2015-01-25' 
and orgz_cd = 'CFVMC'
and dsply_val NOT like ('%SEE%') 

WBC 8.6     0   0   0
WBC 7.8     0   0   0
WBC 13.4    0   0   0
WBC 5.9     0   0   0
WBC 8.2     0   0   0
WBC 5.9     0   0   0
WBC 7.5     0   0   0

WBC 15.2    1   1   1
WBC 15.2    0   0   0

2 个答案:

答案 0 :(得分:1)

我认为你的专栏中有换行符或回车符或制表符号。 其实我可以重现你的问题:

SET NOCOUNT ON
GO


将字符串设置为6 +回车符+换行符+标签

DECLARE @s NVARCHAR(MAX)  = '6' + CHAR(13) + CHAR(10) + CHAR(9)


你只看到6

SELECT @s


但是字符串的长度是4:

SELECT LEN(@s)


以下是ISNUMERIC函数的结果:

SELECT ISNUMERIC(@s) 


甚至TRIM也无济于事:

SELECT ISNUMERIC(LTRIM(RTRIM(@s)))


你应该替换那些字符:

SELECT ISNUMERIC(REPLACE(REPLACE(REPLACE(@s, CHAR(10), ''), CHAR(13), ''), CHAR(9), ''))


您可以打印出字符串中的所有字符,这样您就可以用空格''替换字符串中的非数字字符:

DECLARE @i INT = 1
WHILE @i <=  len(@s)
BEGIN
    PRINT ASCII(SUBSTRING(@s, @i, 1))
    SET @i = @i + 1
END

答案 1 :(得分:0)

使用此功能代替ISNUMERIC。功能中添加了Trim功能。

CREATE FUNCTION dbo.isReallyNumeric  
(  
    @num VARCHAR(64)  
)  
RETURNS BIT  
BEGIN  

    SET @num = LTRIM(RTRIM(@num))

    IF LEFT(@num, 1) = '-'  
        SET @num = SUBSTRING(@num, 2, LEN(@num))  

    DECLARE @pos TINYINT  

    SET @pos = 1 + LEN(@num) - CHARINDEX('.', REVERSE(@num))  

    RETURN CASE  
    WHEN PATINDEX('%[^0-9.-]%', @num) = 0  
        AND @num NOT IN ('.', '-', '+', '^') 
        AND LEN(@num)>0  
        AND @num NOT LIKE '%-%' 
        AND  
        (  
            ((@pos = LEN(@num)+1)  
            OR @pos = CHARINDEX('.', @num))  
        )  
    THEN  
        1  
    ELSE  
    0  
    END  
END  
GO  

并使用查询

SELECT ColumnName
FROM Yourtable
WHERE DBO.isReallyNumeric(ColumnName)=1