Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menghapus angka nol di depan dari pengembang varchar sql

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kelompokkan menurut alias (Oracle)

  2. 12c kolom IDENTITAS

  3. Oracle Dynamic Pivoting

  4. Cara Menghapus Nol ketika Bagian Integer adalah Nol di Oracle

  5. meneruskan array ke prosedur Oracle