Oracle
 sql >> база данни >  >> RDS >> Oracle

Премахване на водещи нули от varchar sql developer

Oracle има вграден TRIM функции за низове. Ако приемем, че имате низ като '00012345' и искате да го запазите като низ, а не да го преобразувате в действителен NUMBER , можете да използвате LTRIM функция с незадължителния втори set параметър, указващ, че изрязвате нули:

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

LTRIM
-----
12345

Ако може да имате и водещи интервали, можете да отрежете и двете наведнъж:

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

LTRIM
-----
12345

Можете също да конвертирате в число и обратно, но това изглежда като много работа, освен ако нямате друго форматиране, което искате да премахнете:

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

Между другото, непосредствената причина да получите ORA-01722 от първия си опит е, че използвате цифровия + оператор вместо оператора за концентриране на низове на Oracle || . Той прави имплицитно преобразуване на вашия низ в число, което изглежда се опитвате да избегнете, а неявното преобразуване на единичния интервал - каквото и да е това - причинява грешката. (Възможно е някои от вашите стойности всъщност изобщо не са числа - друг пример защо числата трябва да се съхраняват в NUMBER полета; и ако случаят е такъв, тогава преобразуването (или прехвърлянето) в число и обратно все пак ще получи ORA-01722). Ще получите същото при втория опит, ако използвате LENGTH вместо LEN . Нито едно от двете няма да работи като INSTR не разпознава регулярни изрази. Можете да използвате REGEXP_INSTR вместо това, но би било по-добре с REGEXP_REPLACE на @schurik версия, ако искате да минете по този път.

Не съм сигурен, че разбирам редакцията на въпроса ви. Изглежда, че вашата вложка може да бъде опростена до:

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

(Не разбирам защо правите подзаявка във вашата версия или защо получавате изрязаната стойност от друг подзаявка.)

Можете също да използвате 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли Oracle SQL заявка, която обединява множество редове в един ред?

  2. Как да получа генерирани ключове от JDBC пакетно вмъкване в Oracle?

  3. Как да настроите свързан сървър към база данни на Oracle на SQL 2000/2005?

  4. Как да използвам PBKDF2 в Oracle 12c?

  5. OracleException (0x80004005) при свързване към база данни на Oracle