Nếu bạn gặp lỗi đó từ một chuỗi như 13.5
thì NLS_NUMERIC_CHARACTERS
của phiên của bạn dường như được đặt để sử dụng dấu phẩy làm dấu phân cách thập phân:
alter session set nls_numeric_characters=',.';
with your_table (bikou) as (
select '10' from dual
union all select '12' from dual
union all select '13.5' from dual
union all select null from dual
)
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', '')))
from your_table;
SQL Error: ORA-01722: invalid number
Bạn có thể đặt phiên một cách rõ ràng để sử dụng dấu chấm làm dấu phân tách thập phân hoặc cung cấp mặt nạ định dạng sử dụng dấu chấm:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Hoặc sử dụng điểm đánh dấu phân tách thập phân trong mô hình và ghi đè cài đặt NLS của phiên:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
'99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Mặt nạ rõ ràng phải phù hợp với tất cả các giá trị mà bạn mong đợi từ regex của mình; những gì tôi đã sử dụng có thể không hoàn toàn phù hợp với dữ liệu của bạn.
Loại vấn đề này là lý do tại sao bạn không nên lưu trữ số hoặc ngày tháng dưới dạng chuỗi. Sử dụng loại dữ liệu chính xác cho các cột của bạn.