1

USRDEF05 varchar(30)在表中有一列SOP10106声明为包含所有数字的列,当我尝试执行以下查询时,我收到转换错误。

Select 
    DETAIL.SUBTOTAL as Sub_Total,
    CASE 
       when USERDEF.USRDEF05 <> ' ' THEN USERDEF.USRDEF05 
       ELSE 0 
    END as Winsys
FROM 
    SOP10100 DETAIL
Right JOIN 
    SOP10106 USERDEF ON USERDEF.soptype = DETAIL.soptype 
WHERE 
    BACHNUMB ='WINSYS112012' 

谁能给我一个想法如何解决这个错误?

4

4 回答 4

0

尝试这个 -

CASE when ISNUMERIC(USERDEF.USRDEF05) <> 0 THEN 
CAST(CAST(USERDEF.USRDEF05 as DECIMAL) as int) ELSE 0 END as Winsys

注意:- 这会将十进制值四舍五入为最接近的整数。

例如:- 如果您的值为 1409.32,则生成的 int 值为 1409

如果您的值为 1409.64,则生成的 int 值为 1410

于 2012-12-04T07:47:07.850 回答
0

我猜问题不在于这个值 1,409.32 尝试使用ISNUMERIC()函数运行此查询:

Select 
    DETAIL.SUBTOTAL as Sub_Total,
    CASE 
       when isnumeric(USERDEF.USRDEF05) = 1 
            THEN cast(USERDEF.USRDEF05 as decimal(12,2))
       ELSE 0 
    END as Winsys
FROM 
    SOP10100 DETAIL
Right JOIN 
    SOP10106 USERDEF ON USERDEF.soptype = DETAIL.soptype 
WHERE 
    BACHNUMB ='WINSYS112012'

并检查哪里有错误:

select USRDEF05 from USERDEF 
where isnumeric(USERDEF.USRDEF05) = 0 
and USERDEF.USRDEF05 <> ' '
于 2012-12-04T08:17:20.757 回答
0

因为您的数据库架构不正确(数字不应该存储为文本),所以下一个不正确的语句也应该起作用:

Select 
    DETAIL.SUBTOTAL as Sub_Total,
    CASE 
       when USERDEF.USRDEF05 <> ' ' THEN USERDEF.USRDEF05 
       ELSE '0' 
    END as Winsys
于 2012-12-04T08:05:29.237 回答
0

我真的不是您尝试接收的内容,因为USRDEF05它是字符串,但似乎您想要的Winsys是数字。

这里有几种方法:

Winsys是字符串

Select 
DETAIL.SUBTOTAL as Sub_Total,
CASE 
   when USERDEF.USRDEF05 <> ' ' THEN USERDEF.USRDEF05 
   ELSE '0' 
END as Winsys

Winsys是数字

Select 
DETAIL.SUBTOTAL as Sub_Total,
CASE 
   when USERDEF.USRDEF05 <> ' ' THEN CONVERT(MONEY, USERDEF.USRDEF05, 1)
   ELSE 0 
END as Winsys
于 2012-12-04T08:08:37.683 回答