sql >> Databáze >  >> RDS >> Oracle

Odstranění úvodních nul z vývojáře varchar sql

Oracle má vestavěný TRIM funkce pro řetězce. Za předpokladu, že máte řetězec jako '00012345' a chcete jej zachovat jako řetězec, nikoli jej převést na skutečné NUMBER , můžete použít LTRIM funkce s volitelnou druhou set parametr určující, že ořezáváte nuly:

select ltrim('000012345', '0') from dual;

LTRIM
-----
12345

Pokud máte také úvodní mezery, můžete oříznout obě najednou:

select ltrim(' 00012345', '0 ') from dual;

LTRIM
-----
12345

Můžete také převést na číslo a zpět, ale to se zdá být hodně práce, pokud nemáte jiné formátování, které chcete odstranit:

select to_char(to_number('000012345')) from dual;

Mimochodem, bezprostřední důvod, proč jste získali ORA-01722 při prvním pokusu, je ten, že používáte číselné + operátor místo operátoru koncentrace řetězců Oracle || . Provádí implicitní převod vašeho řetězce na číslo, kterému se, jak se zdá, snažíte vyhnout, a implicitní převod jediné mezery – ať už je to cokoliv – způsobuje chybu. (Některé z vašich hodnot možná nejsou ve skutečnosti vůbec čísla – další příklad toho, proč by čísla měla být uložena v NUMBER pole; a pokud tomu tak je, převod (nebo přetypování) na číslo a zpět by stále získal ORA-01722). Při druhém pokusu byste dostali totéž, pokud byste použili LENGTH místo LEN . Ani jedno by stejně nefungovalo jako INSTR nerozpoznává regulární výrazy. Můžete použít REGEXP_INSTR místo toho, ale bylo by vám lépe s REGEXP_REPLACE @schurik verzi, pokud byste chtěli jít touto cestou.

Nejsem si jistý, jestli rozumím úpravě vašeho dotazu. Zdá se, že vaši přílohu lze zjednodušit na:

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

(Nerozumím tomu, proč ve své verzi provádíte dílčí dotaz nebo proč získáváte oříznutou hodnotu z jiné dílčí dotaz.)

Můžete také použít 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. 3 způsoby, jak vrátit řádky, které obsahují alfanumerické znaky na serveru SQL

  2. Získejte horní 1 řádek každé skupiny

  3. Spravujte MySQL pomocí phpMyAdmin na Debianu 5 (Lenny)

  4. Jak nainstalovat a nakonfigurovat MaxScale pro MariaDB