Oracle har inbyggd TRIM
funktioner för strängar. Förutsatt att du har en sträng som '00012345'
och du vill behålla den som en sträng, inte konvertera den till ett faktiskt NUMBER
, kan du använda LTRIM
funktion med den valfria andra set
parameter som anger att du trimmar nollor:
select ltrim('000012345', '0') from dual;
LTRIM
-----
12345
Om du kanske också har inledande mellanslag kan du trimma båda på en gång:
select ltrim(' 00012345', '0 ') from dual;
LTRIM
-----
12345
Du kan också konvertera till ett tal och tillbaka, men det verkar vara mycket jobb om du inte har annan formatering som du vill ta bort:
select to_char(to_number('000012345')) from dual;
För övrigt är den omedelbara anledningen till att du skaffar ORA-01722 från ditt första försök att du använder det numeriska +
operator istället för Oracles strängkoncentrationsoperator ||
. Det gör en implicit omvandling av din sträng till ett nummer, som det verkar som du försöker undvika, och den implicita omvandlingen av det enda utrymmet - vad det än är för - orsakar felet. (Möjligen är några av dina värden inte alls siffror - ytterligare ett exempel på varför siffror bör lagras i NUMBER
fält; och om så är fallet då omvandling (eller casting) till ett nummer och tillbaka skulle fortfarande få ORA-01722). Du skulle få samma sak i det andra försöket om du använde LENGTH
istället för LEN
. Ingendera skulle fungera ändå som INSTR
känner inte igen reguljära uttryck. Du kan använda REGEXP_INSTR
istället, men du skulle ha det bättre med @schuriks REGEXP_REPLACE
version om du ville gå den vägen.
Jag är inte säker på att jag förstår din fråga. Det ser ut som att din insats kan förenklas till:
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 '));
(Jag förstår inte varför du gör en underfråga i din version, eller varför du får det trimmade värdet från en annan underfråga.)
Du kan också använda 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);