dsply_val
是varchar(2000)
字段。当我运行下面的查询时,isnumeric
列的值为0,即使这些值看起来是数字。我正在尝试对此列执行简单的计算,但当我尝试转换为decimal
或float
时,我最终收到转换错误。正如您在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
答案 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