我在这里:
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中选择的字段的空白值。下面是我的工作查询的简化版本:
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样本数据

发布于 2016-05-03 20:08:25
在去掉所有前导零并筛选出“混合”值之后,您可以将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发布于 2016-05-03 20:07:12
这是一个SQL (实际上是一个数据库)问题,而不是PL/SQL。你需要解决这个问题--如果你有必要的话,和你的老板打一架。项目代码必须是两个表之一的主键,而在另一个表中必须是指向PK的外键。或者,项目代码是您没有向我们展示的另一个表中的PK,而您展示给我们的两个表中的项目代码都应该是指向该PK的FK。
你现在没有这样的安排,这正是你有这么多麻烦的原因。数据类型必须匹配(现在不匹配),而且您不应该有类似于“混合”之类的值--除非业务规则允许这样做,然后字段应该是VARCHAR2,“复合”应该是PK列中的值之一(不管在哪个表中)。
在您的示例中,问题是VARCHAR2格式的代码以前导0开头,因此,如果您比较转换为字符串的数字,则永远得不到匹配(在外部联接中,总是假定匹配为NULL)。
相反,当您将数字转换为字符串时,添加如下所示的前导零:
...on a.ITM_CD = TO_CHAR(b.ITM_CD, '099999')发布于 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)
https://stackoverflow.com/questions/37012731
复制相似问题