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

Fjernelse af foranstillede nuller fra varchar sql developer

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


  1. ORA-00972-id er for langt aliaskolonnenavn

  2. Sådan opretter du en udvidelse til SSMS 2019 (v18)

  3. SQL Server Internals:Problematiske Operatører Pt. I – Scanninger

  4. Postgres-forespørgselsoptimering (tvinger en indeksscanning)