ORA-01722- Неверный номер - PullRequest
       14

ORA-01722- Неверный номер

0 голосов
/ 23 января 2020

У меня есть запрос в сообщении об ошибке выброса

ORA-01722 : неверный номер.

Я пробовал много способов, но безуспешно .

select h.column  
  from table1 h,table2 c 
 where c.created_date='17-MAY-17' 
   and nvl(c.acct_nmbr,0)=nvl(to_number(h.v_acct_num),0) 
  • c.acct_nmbr имеет NUMBER(19,0)
  • h.v_acct_num имеет varchar2(4000 byte)

Пожалуйста, предложите мне решение

Ответы [ 3 ]

3 голосов
/ 23 января 2020

Если вы используете Oracle 12.2 или выше , тогда вы можете использовать предложение TO_NUMBER с ON CONVERSION ERROR следующим образом:

SELECT
    H.COLUMN
FROM
    TABLE1 H
    JOIN TABLE2 C 
    ON NVL(C.ACCT_NMBR, 0) = NVL(TO_NUMBER(H.V_ACCT_NUM DEFAULT -999 ON CONVERSION ERROR), 0)
    -- use any number which is impossible in your column 
    -- so that it do not match any random records.
WHERE
    C.CREATED_DATE = DATE '2017-05-17';

Примечание:

  • Используйте стандартные ANSI объединения
  • Используйте DATE литерал везде, где вы хотите преобразовать строку в дату или TO_DATE функция

Приветствия! !

1 голос
/ 23 января 2020

Очевидно, что v_acct_num столбец содержит ненулевые c значения. Функция to_number() имеет ограничение на то, что значение в аргументе не должно содержать никаких ненулевых символов c, в противном случае система отбрасывает ORA-01722 : invalid number. Если вы уверены в совпадении данных при извлечении нечисловых символов c, используйте regexp_replace(t2.v_acct_num,'[^[:digit:]]') в сопоставлении предложения join * on:

select t2.column  
  from table1 t1
  join table2 t2 on nvl(t1.acct_nmbr,0) = nvl(regexp_replace(t2.v_acct_num,'[^[:digit:]]'),0)
 where t2.created_date = date'2017-05-17'

Используйте ANSI-92 стандарт для Join и ISO-8601 стандарт для date синтаксиса.

0 голосов
/ 23 января 2020

Определите, какие данные не являются числами c:

select * from table1 h
where regexp_like(h.v_acct_num, '[^0-9]')

и удалите их

.

Надеюсь, это поможет.

...