Oracle đã tích hợp sẵn TRIM
các hàm cho chuỗi. Giả sử bạn có một chuỗi như '00012345'
và bạn muốn giữ nó dưới dạng một chuỗi, không chuyển nó thành một NUMBER
thực tế , bạn có thể sử dụng LTRIM
chức năng với set
thứ hai tùy chọn tham số xác định rằng bạn đang cắt các số không:
select ltrim('000012345', '0') from dual;
LTRIM
-----
12345
Nếu bạn cũng có thể có khoảng trắng ở đầu, bạn có thể cắt cả hai trong một lần:
select ltrim(' 00012345', '0 ') from dual;
LTRIM
-----
12345
Bạn cũng có thể chuyển đổi thành một số và quay lại, nhưng điều đó có vẻ như rất nhiều công việc trừ khi bạn có định dạng khác mà bạn muốn loại bỏ:
select to_char(to_number('000012345')) from dual;
Ngẫu nhiên, lý do ngay lập tức khiến bạn nhận được ORA-01722 từ lần thử đầu tiên là bạn đang sử dụng +
số toán tử thay vì toán tử tập trung chuỗi của Oracle ||
. Nó đang thực hiện một chuyển đổi ngầm định chuỗi của bạn thành một số, điều mà có vẻ như bạn đang cố gắng tránh và chuyển đổi ngầm định của một khoảng trắng - bất kể mục đích gì - đang gây ra lỗi. (Có thể một số giá trị của bạn hoàn toàn không phải là số - một ví dụ khác về lý do tại sao các số nên được lưu trữ trong NUMBER
lĩnh vực; và nếu trường hợp đó xảy ra thì việc chuyển đổi (hoặc truyền) thành một số và quay lại sẽ vẫn nhận được ORA-01722). Bạn sẽ nhận được điều tương tự trong lần thử thứ hai nếu bạn đang sử dụng LENGTH
thay vì LEN
. Cả hai đều không hoạt động dưới dạng INSTR
không nhận dạng được biểu thức chính quy. Bạn có thể sử dụng REGEXP_INSTR
thay vào đó, nhưng bạn sẽ tốt hơn với REGEXP_REPLACE
của @ schurik phiên bản nếu bạn muốn đi theo lộ trình đó.
Tôi không chắc tôi hiểu câu hỏi của bạn chỉnh sửa. Có vẻ như phụ trang của bạn có thể được đơn giản hóa thành:
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 '));
(Tôi không hiểu tại sao bạn đang thực hiện một truy vấn con trong phiên bản của mình hoặc tại sao bạn lại nhận được giá trị bị cắt bớt từ cái khác truy vấn con.)
Bạn cũng có thể sử dụng 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);