Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Entfernen führender Nullen aus varchar sql developer

Oracle hat eingebautes TRIM Funktionen für Zeichenketten. Angenommen, Sie haben eine Zeichenfolge wie '00012345' und Sie möchten es als Zeichenfolge behalten und nicht in eine tatsächliche NUMBER umwandeln , können Sie den LTRIM verwenden Funktion mit dem optionalen zweiten set Parameter, der angibt, dass Sie Nullen kürzen:

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

LTRIM
-----
12345

Wenn Sie möglicherweise auch führende Leerzeichen haben, können Sie beide auf einmal kürzen:

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

LTRIM
-----
12345

Sie könnten auch in eine Zahl und zurück konvertieren, aber das scheint eine Menge Arbeit zu sein, es sei denn, Sie haben andere Formatierungen, die Sie entfernen möchten:

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

Übrigens, der unmittelbare Grund, warum Sie beim ersten Versuch den ORA-01722 erhalten, ist, dass Sie den numerischen + verwenden -Operator anstelle des Zeichenfolgenkonzentrationsoperators || von Oracle . Es führt eine implizite Konvertierung Ihrer Zeichenfolge in eine Zahl durch, die Sie anscheinend vermeiden möchten, und die implizite Konvertierung des einzelnen Leerzeichens - wofür auch immer - verursacht den Fehler. (Möglicherweise sind einige Ihrer Werte überhaupt keine Zahlen - ein weiteres Beispiel dafür, warum Zahlen in NUMBER gespeichert werden sollten Felder; und wenn das der Fall ist, würde das Konvertieren (oder Casten) in eine Nummer und zurück immer noch den ORA-01722 erhalten). Sie würden beim zweiten Versuch dasselbe erhalten, wenn Sie LENGTH verwenden würden statt LEN . Beides würde sowieso nicht als INSTR funktionieren erkennt keine regulären Ausdrücke. Sie könnten REGEXP_INSTR verwenden stattdessen, aber Sie wären besser dran mit REGEXP_REPLACE von @schurik Version, wenn Sie diesen Weg gehen wollten.

Ich bin mir nicht sicher, ob ich Ihre Fragebearbeitung verstehe. Es sieht so aus, als könnte Ihre Einfügung vereinfacht werden zu:

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

(Ich verstehe nicht, warum Sie in Ihrer Version eine Unterabfrage durchführen oder warum Sie den gekürzten Wert von einer anderen erhalten Unterabfrage.)

Sie können auch MERGE verwenden :

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