【问题标题】:Oracle SQL - to_number and inner joinOracle SQL - to_number 和内连接
【发布时间】:2018-08-20 07:21:59
【问题描述】:

233@REMOTE_DB.RESULT_COUNT 是一个varchar2 字段,大多数是数字。 只有7行数据包含空格或其他字符,

我找到了这 7 行

SELECT * FROM 233@REMOTE_DB WHERE REGEXP_LIKE(RESULT_COUNT, '[^0-9]')

WITH TABLE_233 as (
  select *
  from 233@REMOTE_DB where 
  RESULT_COUNT IS NOT NULL     
),
NON_NUMERIC_FILTER_233 AS (
  select ID, comment, LAST_UPDATED, TO_NUMBER(RESULT_COUNT) AS 
RESULT_COUNT_NUM  
  from TABLE_233 where id NOT IN  (
  '11', 
  '22',
  '33',
  '44',
  '55',
  '66',
  '77' 
  ) 
),
NON_NUMERIC_FILTER_233_LARGER_THAN_ONE AS (
 select * from NON_NUMERIC_FILTER_233 where RESULT_COUNT_NUM > 0 
 and lower(comment) in ('s','t','m','n','p','i','p','o','s','u')
)   
select a.* from NON_NUMERIC_FILTER_233_LARGER_THAN_ONE a inner join 
234@REMOTE_DB r1 on
            a.ID = r1.id 

返回

ORA-01722: 无效号码
ORA-02063: 来自 [dblink 名称]
的前一行 01722. 00000 - “无效号码”
*原因:指定的号码无效。
*操作:指定一个有效的数字。

WITH TABLE_233 as (
  select *
  from 233@REMOTE_DB where 
  RESULT_COUNT IS NOT NULL     
),
NON_NUMERIC_FILTER_233 AS (
  select ID, comment, LAST_UPDATED, TO_NUMBER(RESULT_COUNT) AS 
RESULT_COUNT_NUM  
  from TABLE_233 where id NOT IN  (
  '11', 
  '22',
  '33',
  '44',
  '55',
  '66',
  '77' 
  ) 
),
NON_NUMERIC_FILTER_233_LARGER_THAN_ONE AS (
 select * from NON_NUMERIC_FILTER_233 where RESULT_COUNT_NUM > 0 
 and lower(comment) in ('s','t','m','n','p','i','p','o s','u')
)   
select a.* from NON_NUMERIC_FILTER_233_LARGER_THAN_ONE a

成功了

为什么inner join会导致'invalid number'的错误?

【问题讨论】:

  • 'inner join 234@REMOTE_DB r1 on' - 对吗?您将表命名为数字,但未引用以允许它
  • 233@REMOTE_DB 和 234@REMOTE_DB r1 不是实名
  • 233 是你的远程表名吗?

标签: sql oracle join types common-table-expression


【解决方案1】:

ORA-01722: invalid number 发生在您尝试将错误的数据类型作为 varchar 和 number 进行比较时,

尝试将字符串转换为数字失败,因为字符串不是有效的数字文字

您可以更改您的 SQL,例如 id 不在数字列表中:

where id NOT IN  (
  11, 
  22,
  33,
  44,
  55,
  66,
  77 
  ) 

如果问题是 to_number of varchar 列,您可以创建 own tonumber 函数并将其用作:

创建或替换函数 tonumeric(v in varchar2) 返回数字为

数字;

开始

num := to_number(v);

返回数字;

异常

当别人那么

返回空值;

结束;

【讨论】:

  • 我试过但结果相同。两个表都可以通过 id 字段进行内连接,但是我使用 to_number 后出现错误...看来内连接和 to_number 不允许同时存在
  • 允许它们一起存在,尽管在性能方面没有功能索引会很糟糕。
  • 问题是 RESULT_COUNT 列包含无效数字,可能是字符
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 2023-03-23
  • 1970-01-01
  • 2018-07-31
  • 2017-12-19
  • 1970-01-01
  • 2022-01-13
  • 2020-11-28
相关资源
最近更新 更多