使用 Cast on Left Join 将 VARCHAR 更改为 DECIMAL
Posted
技术标签:
【中文标题】使用 Cast on Left Join 将 VARCHAR 更改为 DECIMAL【英文标题】:Using Cast on Left Join to Change VARCHAR to DECIMAL 【发布时间】:2019-03-29 06:34:13 【问题描述】:我需要使用包含文本数据和帐号的用户定义列 (UDF1) 将表连接到另一个帐号表 (LDACCT)。帐号应格式化为十进制 (16,0),但 UDF1 列中包含文本数据(以及帐号),因为 UDF1 还用于存放帐号以外的其他目的(不是我的设计)。我当前的加入不起作用:
left outer join dbo.tbl_Loan_Legal_Descriptions as ll2
on CAST(uf.UDF1 as decimal(16, 0)) = ll2.LDACCT
我得到了可怕的消息:Error converting data type varchar to numeric
,我似乎无法修改连接来解决错误。任何建议将不胜感激。
【问题讨论】:
如果您必须在 JOIN 条件下使用 CAST,则表明您的数据库设计不佳。改为修复它! 怎么样:... on CAST(uf.UDF1 as varchar(255)) = cast(ll2.LDACCT as varchar(255)) ?? @jarlh 也许操作者没有这样做的权限 jarlh - 如果可以的话,我会的 - 正如 Lamak 所猜测的那样!让我试试 Eray 的想法 - 谢谢大家的意见! Eray 的“翻转脚本”解决方案完美运行。谢谢! 【参考方案1】:请将“on”部分更改为:
on CAST(uf.UDF1 as varchar(255)) = cast(ll2.LDACCT as varchar(255))
【讨论】:
【参考方案2】:您在uf
中的某一行可能包含无法转换为decimal
的内容。试试
select
*
from uf
where left(uf.UDF1,1) not in ('0','1','2','3','4','5','6','7','8','9')
根据您是否要忽略该行,您可以尝试通过其他条件排除该行,也可以翻转连接,将另一侧转换为字符串:
...
left outer join dbo.tbl_Loan_Legal_Descriptions as ll2
on uf.UDF1 = cast(varchar,ll2.LDACCT)
如果您尝试这样做,您可能需要从 uf.UDF1
中去除前导零,但由于您没有向我们展示表格中的任何代表性数据,我们在这里所能做的只是猜测或谨慎。
【讨论】:
Corlon,你的第二个建议类似于 Eray 的完美工作。 UDF1 中不是帐号的 varchar 值有所不同,但它们通常是文本和数字的混合,但没有前导 0。谢谢!以上是关于使用 Cast on Left Join 将 VARCHAR 更改为 DECIMAL的主要内容,如果未能解决你的问题,请参考以下文章
SQL中left join on 、right join on、inner join on之间的区别
深入Oracle的left join中on和where的区别详解
创建一个视图,让您向 LEFT JOIN ... ON? 添加条件?