Oracle memiliki TRIM
. bawaan fungsi untuk string. Dengan asumsi Anda memiliki string seperti '00012345'
dan Anda ingin menyimpannya sebagai string, bukan mengubahnya menjadi NUMBER
actual yang sebenarnya , Anda dapat menggunakan LTRIM
berfungsi dengan set
kedua opsional parameter yang menentukan bahwa Anda memangkas nol:
select ltrim('000012345', '0') from dual;
LTRIM
-----
12345
Jika Anda mungkin juga memiliki spasi utama, Anda dapat memangkas keduanya sekaligus:
select ltrim(' 00012345', '0 ') from dual;
LTRIM
-----
12345
Anda juga dapat mengonversi ke angka dan sebaliknya, tetapi itu sepertinya banyak pekerjaan kecuali Anda memiliki pemformatan lain yang ingin Anda hapus:
select to_char(to_number('000012345')) from dual;
Kebetulan, alasan langsung Anda mendapatkan ORA-01722 dari upaya pertama Anda adalah karena Anda menggunakan +
numerik operator alih-alih operator konsentrasi string Oracle ||
. Itu melakukan konversi implisit dari string Anda ke angka, yang sepertinya Anda coba hindari, dan konversi implisit dari satu spasi - apa pun itu - menyebabkan kesalahan. (Mungkin beberapa nilai Anda sebenarnya bukan angka sama sekali - contoh lain mengapa angka harus disimpan di NUMBER
bidang; dan jika itu masalahnya, maka mengonversi (atau casting) ke angka dan kembali masih akan mendapatkan ORA-01722). Anda akan mendapatkan hal yang sama pada percobaan kedua jika Anda menggunakan LENGTH
bukannya LEN
. Keduanya tidak akan berfungsi sebagai INSTR
tidak mengenali ekspresi reguler. Anda dapat menggunakan REGEXP_INSTR
sebagai gantinya, tetapi Anda akan lebih baik dengan REGEXP_REPLACE
@schurik versi jika Anda ingin melalui rute itu.
Saya tidak yakin saya mengerti edit pertanyaan Anda. Sepertinya sisipan Anda dapat disederhanakan menjadi:
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 '));
(Saya tidak mengerti mengapa Anda melakukan subquery dalam versi Anda, atau mengapa Anda mendapatkan nilai yang dipangkas dari lain subkueri.)
Anda juga dapat menggunakan 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);