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