Oracle har indbygget TRIM
funktioner for strenge. Forudsat at du har en streng som '00012345'
og du vil beholde det som en streng, ikke konvertere det til et faktisk NUMBER
, kan du bruge LTRIM
funktion med det valgfrie andet set
parameter, der angiver, at du trimmer nuller:
select ltrim('000012345', '0') from dual;
LTRIM
-----
12345
Hvis du måske også har førende mellemrum, kan du trimme begge dele på én gang:
select ltrim(' 00012345', '0 ') from dual;
LTRIM
-----
12345
Du kan også konvertere til et tal og tilbage, men det virker som en masse arbejde, medmindre du har anden formatering, som du vil fjerne:
select to_char(to_number('000012345')) from dual;
Den umiddelbare årsag til, at du får ORA-01722 fra dit første forsøg, er i øvrigt, at du bruger det numeriske +
operator i stedet for Oracles strengkoncentenationsoperator ||
. Den laver en implicit konvertering af din streng til et tal, som det ser ud til, at du forsøger at undgå, og den implicitte konvertering af det enkelte mellemrum - uanset hvad det er for - forårsager fejlen. (Muligvis er nogle af dine værdier i virkeligheden slet ikke tal - endnu et eksempel på, hvorfor tal skal gemmes i NUMBER
felter; og hvis det er tilfældet, vil konvertering (eller casting) til et nummer og tilbage stadig få ORA-01722). Du ville få det samme i andet forsøg, hvis du brugte LENGTH
i stedet for LEN
. Ingen af dem ville alligevel fungere som INSTR
genkender ikke regulære udtryk. Du kan bruge REGEXP_INSTR
i stedet, men du ville være bedre stillet med @schuriks REGEXP_REPLACE
version, hvis du ville gå den vej.
Jeg er ikke sikker på, at jeg forstår dit spørgsmål. Det ser ud til, at dit indlæg kan forenkles til:
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 '));
(Jeg forstår ikke, hvorfor du laver en underforespørgsel i din version, eller hvorfor du får den trimmede værdi fra en anden underforespørgsel.)
Du kan også bruge 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);