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