首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/:加入VARCHAR2?

PL/:加入VARCHAR2?
EN

Stack Overflow用户
提问于 2016-05-03 19:25:48
回答 3查看 2.4K关注 0票数 0

我在这里:

  • TABLE1.ITM_CD是VARCHAR2数据类型
  • TABLE2.ITM_CD是数字数据类型
  • 执行left join TABLE2 on TABLE1.ITM_CD = TABLE2.ITM_CD生成ORA-01722:无效的数字错误
  • 执行left join TABLE2 on to_number(TABLE1.ITM_CD) = TABLE2.ITM_CD还会产生ORA-01722:无效的数字错误。 -我怀疑这是因为TABLE1.ITM_CD中的一个值是字符串“混合”
  • 成功执行left join TABLE2 on TABLE1.ITM_CD = to_char(TABLE2.ITM_CD),但它返回从TABLE2中选择的字段的空白值。

下面是我的工作查询的简化版本:

代码语言:javascript
复制
select
A.ITM_CD
,B.COST
,B.SIZE
,B.DESCRIPTION
,A.HOLD_REASON

from
TABLE1 a
left join TABLE2 b on a.ITM_CD = to_char(b.ITM_CD)

此查询返回项目代码列表并保存原因,但仅为成本、大小和说明的空白值。我确实确认了TABLE2包含返回代码的这些字段的值。

更新:这里有附加信息的图片。

我从ALL_TAB_COLUMNS中选择了以下信息--我不一定知道所有字段的含义,但我认为这可能会有所帮助

TABLE1样本数据

TABLE2样本数据

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-03 20:08:25

在去掉所有前导零并筛选出“混合”值之后,您可以将TABLE1.ITM_CD转换为一个数字:

代码语言:javascript
复制
select A.ITM_CD
      ,B.COST
      ,B.SIZE
      ,B.DESCRIPTION
      ,A.HOLD_REASON
from  ( SELECT * FROM TABLE1 WHERE ITM_CD <> 'MIXED' ) a
      left join TABLE2 b
      on TO_NUMBER( LTRIM( a.ITM_CD, '0' ) ) = b.ITM_CD
票数 1
EN

Stack Overflow用户

发布于 2016-05-03 20:07:12

这是一个SQL (实际上是一个数据库)问题,而不是PL/SQL。你需要解决这个问题--如果你有必要的话,和你的老板打一架。项目代码必须是两个表之一的主键,而在另一个表中必须是指向PK的外键。或者,项目代码是您没有向我们展示的另一个表中的PK,而您展示给我们的两个表中的项目代码都应该是指向该PK的FK。

你现在没有这样的安排,这正是你有这么多麻烦的原因。数据类型必须匹配(现在不匹配),而且您不应该有类似于“混合”之类的值--除非业务规则允许这样做,然后字段应该是VARCHAR2,“复合”应该是PK列中的值之一(不管在哪个表中)。

在您的示例中,问题是VARCHAR2格式的代码以前导0开头,因此,如果您比较转换为字符串的数字,则永远得不到匹配(在外部联接中,总是假定匹配为NULL)。

相反,当您将数字转换为字符串时,添加如下所示的前导零:

代码语言:javascript
复制
...on a.ITM_CD = TO_CHAR(b.ITM_CD, '099999')
票数 0
EN

Stack Overflow用户

发布于 2016-05-03 20:08:36

您可以从字符串列中修剪前导零。

select A.ITM_CD ,B.COST ,B.SIZE ,B.DESCRIPTION ,A.HOLD_REASON from TABLE1 a left join TABLE2 b on trim(LEADING '0' FROM a.ITM_CD ) = to_char(b.ITM_CD)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37012731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档