sql >> Databasteknik >  >> RDS >> Oracle

Ta bort inledande nollor från varchar sql-utvecklare

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


  1. MS SQL PÅ DELETE CASCADE flera främmande nycklar som pekar på samma tabell?

  2. Hur man formaterar siffror med kommatecken i MySQL

  3. Fördröjd hållbarhet i SQL Server 2014

  4. Hur du formulerar ditt värde som DBA för finanschefer