Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Xóa các số 0 ở đầu khỏi nhà phát triển varchar sql

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:Exhausted Resultset

  2. CURRENT_TIMESTAMP và SYSDATE khác nhau trong tiên tri

  3. Ví dụ về hàm Pipelined của Oracle

  4. Hàm CONCAT () trong Oracle

  5. Làm thế nào để cài đặt ruby-oci8?