Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Removendo zeros à esquerda do desenvolvedor varchar sql


A Oracle tem o TRIM integrado funções para strings. Supondo que você tenha uma string como '00012345' e você deseja mantê-lo como uma string, não convertê-lo em um NUMBER real , você pode usar o LTRIM função com o segundo opcional set parâmetro especificando que você está cortando zeros:
select ltrim('000012345', '0') from dual;

LTRIM
-----
12345

Se você também tiver espaços à esquerda, poderá aparar os dois de uma só vez:
select ltrim(' 00012345', '0 ') from dual;

LTRIM
-----
12345

Você também pode converter para um número e vice-versa, mas isso parece muito trabalhoso, a menos que você tenha outra formatação que queira remover:
select to_char(to_number('000012345')) from dual;

Aliás, a razão imediata pela qual você obtém o ORA-01722 em sua primeira tentativa é que você está usando o + numérico operador em vez do operador de concentração de string do Oracle || . Ele está fazendo uma conversão implícita de sua string para um número, o que parece que você está tentando evitar, e a conversão implícita do espaço único - seja lá o que for - está causando o erro. (Possivelmente alguns de seus valores não são, de fato, números - outro exemplo de por que os números devem ser armazenados em NUMBER Campos; e se for esse o caso, a conversão (ou conversão) para um número e de volta ainda obteria o ORA-01722). Você obteria a mesma coisa na segunda tentativa se estivesse usando LENGTH em vez de LEN . Nem funcionaria de qualquer maneira como INSTR não reconhece expressões regulares. Você pode usar REGEXP_INSTR em vez disso, mas seria melhor usar o REGEXP_REPLACE de @schurik versão se você quisesse seguir esse caminho.

Não sei se entendi sua pergunta edit. Parece que sua inserção pode ser simplificada para:
INSERT INTO temp_table (columnNeedTrim, column2, column3, column4, column5)
SELECT LTRIM(table1.columnNeedTrim, '0 '),
    table1.column2,
    table1.column3,
    table1.column4,
    table1.column5
FROM table1
INNER JOIN table2 ON table2.columnNeedTrim = table1.columnNeedTrim
WHERE NOT EXISTS (
    SELECT * FROM temp_table
    WHERE columnNeedTrim = LTRIM(t42.columnNeedTrim, '0 '));

(Não entendo por que você está fazendo uma subconsulta em sua versão ou por que está obtendo o valor aparado de outro subconsulta.)

Você também pode usar MERGE :
MERGE INTO temp_table tt
USING (
    SELECT LTRIM(t42.columnNeedTrim, '0 ') AS columnNeedTrim,
        t42.column2,
        t42.column3,
        t42.column4,
        t42.column5
    FROM t42 
    INNER JOIN t43 ON t43.columnNeedTrim=t42.columnNeedTrim
) sr
ON (sr.columnNeedTrim = tt.columnNeedTrim)
WHEN NOT MATCHED THEN
INSERT (tt.columnNeedTrim, tt.column2, tt.column3, tt.column4, tt.column5)
VALUES (sr.columnNeedTrim, sr.column2, sr.column3, sr.column4, sr.column5);