PL / SQL Developer:将VARCHAR2加入NUMBER?

时间:2016-05-03 19:25:49

标签: sql oracle

我在哪里:

  • TABLE1.ITM_CD是VARCHAR2数据类型
  • TABLE2.ITM_CD是NUMBER数据类型
  • 执行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中的一个值是字符串" MIXED"
  • 执行left join TABLE2 on TABLE1.ITM_CD = to_char(TABLE2.ITM_CD)成功运行,但它会为从TABLE2中选择的字段返回空白值。

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

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中选择了以下信息 - 我不一定知道所有字段的含义,但认为它可能会有所帮助

Information

TABLE1 示例数据
TABLE1 image

TABLE2 示例数据
TABLE2 image

3 个答案:

答案 0 :(得分:1)

您可以在删除任何前导零后将TABLE1.ITM_CD转换为数字并过滤掉“混合”值:

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 :(得分:0)

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

你现在没有那种安排,这正是你遇到这些麻烦的原因。数据类型必须匹配(现在不是),并且你不应该有像'MIXED'这样的值 - 除非你的业务规则允许它,然后字段应该是VARCHAR2并且'MIXED'应该是其中一个值PK列(无论哪个表都在其中)。

在您的情况下,问题是VARCHAR2格式的代码以前导0开头,因此如果您与转换为字符串的数字进行比较,则永远不会得到匹配(并且在外部联接中,始终假定匹配为了NULL)。

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

...on a.ITM_CD = TO_CHAR(b.ITM_CD, '099999')

答案 2 :(得分:0)

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

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)