将varchar值'U'转换为int数据类型时转换失败

问题描述 投票:0回答:2

我在字段Q1_cQ2_c中收到“将varchar转换为int的错误”。

这些字段是CHAR(1),这些字段的值是1,2,3,4,5或U,但是当有U时它不会转换,所以我尝试更改U的值设为0之类的值。我也尝试过CAST(a.q2_c as varchar(1)) = 'U'-但这也不起作用。我应该使用INT还是VARCHAR()?我也尝试使用CONVERT而不是CAST

ALTER VIEW [dbo].[vCDCP_rptInfantImprove]
as
select distinct
         IND.tb_cdcp_individuals as Individuals_IndividualID 
       , A.[tb_cdcp_individuals] as ATQInfant_IndividualID
       , A.CreateDate as ATQInfant_CreateDate
       , CAST(a.q1_c as varchar(3)) as A_Q1
       , CAST(a.q2_c as varchar(3)) as A_Q2
        ---Infant Sum
       , Sum(isnull(cast(a.Q1_c as int),0)) + Sum(isnull(cast(a.Q2_c as int),0)) as InfantSum
        ---Change U to 0
       , case when CAST(a.q1_c as int) = 'U' then 0 else 0 end as Unknown1
       , case when CAST(a.q2_c as int) = 'U' then 0 else 0 end as Unknown2
from DBO.tb_cdcp_ATQInfant a
left join DBO.tb_cdcp_individuals ind on a.[tb_cdcp_individuals] = ind.[tb_cdcp_individuals]
where ind.agegroup_c = 'C' 
group by IND.tb_cdcp_individuals, A.tb_cdcp_individuals, A.CreateDate   
       ,     a.q1_c
       ,     a.q2_c
GO
sql sql-server
2个回答
0
投票

对我来说,一个简单的想法是定义另一个表...,每个可能的值都带有一个CHAR(1),而对应的数字带有一个INT。然后,只需JOIN到该表。毫无疑问,如果SQL引擎仅包含5行,它将简单地将整个过程吞入内存。如果有一天需要对更多的值进行编码,则很容易做到这一点。


0
投票

您可以通过几种不同的方式进行此操作:

由于字段是字符格式,所以将'u'替换为'0',然后将其转换为int:

CAST(Replace(q1_c,'u','0') as int)

或者如果您想创建一个新的计算字段,则可以直接创建一个整数字段:

Case when q1_c='u' then 0 else CAST(q1_c as int) end as q1_c_calc

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.