我有一个包含8列的数据库表。第一列是客户名称,其他列是分数,但它们存储在nvarchar列中(不幸的是)。在nvarchar列中存储小数的原因是,如果客户没有得分,他们会输入逗号(',')。这种情况仅适用于G列。这个逗号给我带来了很多麻烦,因为我正在尝试进行下面的选择
SELECT
GKOD ,
AVG(CAST(CSI as decimal)),
AVG(CAST(A as decimal)),
AVG(CAST(B as decimal)),
AVG(CAST(C as decimal)),
AVG(CAST(D as decimal)),
AVG(CAST(E as decimal)),
AVG(CAST(F as decimal)),
AVG(
CASE WHEN ISNUMERIC(G) >= 0
THEN CAST(G AS decimal)
ELSE 0 END
)
FROM ANALIZ_DATA WHERE (YIL*100+CAST(AY AS INT)) between 201401 AND 201405
GROUP BY GKOD
对于G栏,我正在尝试检查它是否为数字。但它给出了这个错误
Error converting data type nvarchar to numeric.
我做错了什么?
答案 0 :(得分:4)
isnumeric
会返回0
或1
,因此您的情况无效。相反,只需与1
进行比较:
AVG(CASE WHEN ISNUMERIC(G) = 1
THEN CAST(G AS decimal)
ELSE 0 END
)
此外,您确定要对0
使用值else
吗?这会将非数字值视为0
,而不是忽略它们。您可能只想将它们视为NULL
:
AVG(CASE WHEN ISNUMERIC(G) = 1
THEN CAST(G AS decimal)
END
)
我也倾向于包含精度和比例参数,而不是依赖于默认值。