【问题标题】:Using Cast on Left Join to Change VARCHAR to DECIMAL使用 Cast on Left Join 将 VARCHAR 更改为 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 的“翻转脚本”解决方案完美运行。谢谢!

标签: sql sql-server-2008 decimal varchar sqldatatypes


【解决方案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。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2011-01-02
    • 1970-01-01
    • 2016-01-19
    • 2011-06-26
    • 2012-02-04
    • 2015-05-05
    相关资源
    最近更新 更多