2016-10-20 2 views
0

Using LPAD requirement, все мои выражения - это символы. Почему я получаю сообщение ORA-01722: invalid number?Почему ошибка недопустимого числа при работе со строковыми функциями и строковыми данными?

Я хочу, чтобы оставить pad значение моего varchar2 с ведущими нулями. Все мои airpor_codes до трех байтов, и я хочу, если нужно, оставить левую панель с ведущими нулями. В этом примере я хочу 0777 и 0LAX.

/* This works */ 
with numeric_airport_code 
as (select '777' as airport from dual) 
select airport, 
     to_char(airport,'0000') as to_char_padding, 
     lpad(airport,4,'000') as lpadding 
from numeric_airport_code; 


/* This gives invalid number error */ 

with alpha_airport_code 
as (select 'LAX' as airport from dual) 
select airport, 
     to_char(airport,'000') as to_char_padding, 
     lpad(airport,4,'000') as lpadding 
from alpha_airport_code;  

ответ

2

lpad это не проблема, это to_char(). Во втором запросе вы делаете:

to_char('LAX', '000') 

, который пытается на неявное преобразование к числу первых:

to_char(to_number('LAX'), '000') 

... и to_number('LAX') конечно получает ORA-01722. Не имеет смысла называть to_char() тем, что уже является строкой. В лучшем случае вы получите ненужные преобразования, но часто - как здесь - они неявные и/или потерпят неудачу.

Если вы только использование lpad делает то, что вы сказали, что вы хотите:

with airport_code as (
    select '777' as airport from dual 
    union all select 'LAX' as airport from dual 
) 
select airport, 
     lpad(airport, 4, '0') as lpadding 
from airport_code; 

AIR LPAD 
--- ---- 
777 0777 
LAX 0LAX 

Также обратите внимание, что вам нужно только один ноль в третьем аргументе.

+0

Я не знал, что to_char преобразован в число перед преобразованием обратно в char. Спасибо за объяснение. – zundarz

+1

@zundarz - существует две версии 'to_char()'; один берет номер, другой - дату. Если вы передаете любой другой тип данных, он должен быть неявно преобразован либо в номер, либо в дату, либо вообще не будет никакой подходящей функции. Если вы передаете строку, это преобразование относится к числу. –