sql left将char转换为int?

时间:2017-03-24 13:27:19

标签: sql temp-tables

我试图比较一个表和一个报告表作为测试证明,报告表包含一个12个字符的ID加上它们的DOB,而源表只有一个ID。

select cast(ID as char(12)) as ID into #IDnums
from members
where client='some_client'

select ID
from #IDnums
where ID not in (
     select left(12,rtrim(ltrim(memberID)))
     from report_table
     )

memberID是char(50)字段。当我运行这个时,我收到错误:

  

varchar值的转换' 74857358238119880131'溢出了一个int列。

我不知道varchar或int的来源,或者如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

使用left()时,第一个参数是字符串,第二个参数是长度。

因此,它将memberid上的表达式解释为整数。这就是转换失败的地方。你想要:

select ID
from #IDnums
where ID not in (select left(rtrim(ltrim(memberID)), 12) from report_table);

我认为将not in与子查询一起使用是一个坏习惯。如果memberId永远是NULL,会出现问题。在这种情况下,not in根本不返回任何行。这就是为什么我建议改为使用not exists

我也不清楚为什么要使用临时表。这样做是否符合你的要求:

select id
from members m
where not exists (select 1
                  from report_table rt
                  where left(rt.memberId, 12) = cast(m.id as varchar(12))
                 );

或:

select id
from members m
where not exists (select 1
                  from report_table rt
                  where rt.memberId like concat(m.id, '%')
                 );
相关问题