Oracle
 sql >> Database >  >> RDS >> Oracle

Rimozione degli zeri iniziali dallo sviluppatore varchar sql

Oracle ha integrato TRIM funzioni per le stringhe. Supponendo che tu abbia una stringa come '00012345' e vuoi mantenerlo come una stringa, non convertirlo in un vero NUMBER , puoi usare il LTRIM funzione con il secondo set opzionale parametro che specifica che stai tagliando gli zeri:

select ltrim('000012345', '0') from dual;

LTRIM
-----
12345

Se potresti anche avere spazi iniziali, puoi ritagliarli entrambi in una volta sola:

select ltrim(' 00012345', '0 ') from dual;

LTRIM
-----
12345

Puoi anche convertire in un numero e tornare indietro, ma sembra un sacco di lavoro a meno che tu non abbia un'altra formattazione che desideri eliminare:

select to_char(to_number('000012345')) from dual;

Per inciso, il motivo immediato per cui ottieni ORA-01722 dal tuo primo tentativo è che stai usando il numerico + operatore invece dell'operatore di concentrazione di stringhe di Oracle || . Sta eseguendo una conversione implicita della tua stringa in un numero, che sembra che tu stia cercando di evitare, e la conversione implicita del singolo spazio, qualunque esso sia, sta causando l'errore. (Forse alcuni dei tuoi valori, in effetti, non sono affatto numeri - un altro esempio del motivo per cui i numeri dovrebbero essere memorizzati in NUMBER campi; e in tal caso, la conversione (o il casting) in un numero e viceversa otterrebbe comunque l'ORA-01722). Otterresti la stessa cosa al secondo tentativo se utilizzassi LENGTH invece di LEN . Nessuno dei due funzionerebbe comunque come INSTR non riconosce le espressioni regolari. Potresti usare REGEXP_INSTR invece, ma staresti meglio con REGEXP_REPLACE di @schurik versione se volevi seguire quella strada.

Non sono sicuro di aver capito la modifica della tua domanda. Sembra che il tuo inserto possa essere semplificato in:

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 '));

(Non capisco perché stai eseguendo una sottoquery nella tua versione o perché stai ricevendo il valore tagliato da un altro sottoquery.)

Puoi anche usare 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);