Oracle SQL - to_number和内部联接

时间:2018-03-12 09:58:24

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

233@REMOTE_DB.RESULT_COUNTvarchar2字段,大多数是数字。 只有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

成功

为什么内部联接会导致错误的数字'?

1 个答案:

答案 0 :(得分:0)

当您尝试将错误的数据类型与varchar和number进行比较时,会发生

ORA-01722: invalid number

  

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

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

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

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

  

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

     

num number;

     

开始

     

num:= to_number(v);

     

return num;

     

例外

     

当别人那么

     

返回null;

     

端;