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

Cách định dạng một số bằng dấu phẩy trong Oracle

Khi bạn sử dụng TO_CHAR() chức năng định dạng một số trong Oracle, bạn sử dụng mô hình định dạng để xác định cách định dạng số đó.

Ví dụ:bạn có thể định dạng một số như 12,345.00 hoặc như 12.345,00 , tùy thuộc vào ngôn ngữ của bạn.

Mô hình định dạng có thể bao gồm G hoặc D định dạng các phần tử để thêm dấu phẩy vào một số. Cái nào bạn sử dụng tùy thuộc vào việc bạn muốn dấu phẩy làm dấu phân cách hàng nghìn hay ở dạng ký tự thập phân.

Ngoài ra, bạn có thể sử dụng một ký tự dấu phẩy thực (, ) nếu bạn thích, mặc dù phương pháp này không nhận biết ngôn ngữ như GD các yếu tố định dạng là.

GD Phần tử định dạng

Đây là một ví dụ để chứng minh GD phần tử định dạng:

SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Kết quả:

12,345.00

Trong trường hợp này, dấu phân tách nhóm xuất ra dấu phẩy và ký tự thập phân xuất ra dấu chấm. Đó là vì NLS_TERRITORY của phiên hiện tại của tôi tham số được đặt thành Australia .

Đây là những gì sẽ xảy ra nếu tôi thay đổi NLS_TERRITORY của mình tham số thành Germany :

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Kết quả:

12,345.00

Bây giờ dấu phẩy đang được sử dụng cho ký tự thập phân.

Như một giải thích nhanh về mô hình định dạng trên:

  • fm công cụ sửa đổi định dạng ngăn chặn bất kỳ phần đệm nào có thể được áp dụng cho kết quả.
  • 9 các ký tự đại diện cho số.
  • 0 ký tự đại diện cho các số mà không chặn bất kỳ số không ở đầu hoặc ở cuối.

Dưới đây là danh sách đầy đủ các phần tử định dạng số mà bạn có thể sử dụng làm tài liệu tham khảo nhanh.

T he NLS_NUMERIC_CHARACTERS Tham số

Khi chúng tôi đặt NLS_TERRITORY (như trong ví dụ trước), điều này mặc nhiên đặt một loạt các tham số khác, bao gồm NLS_NUMERIC_CHARACTERS tham số.

T he NLS_NUMERIC_CHARACTERS tham số xác định ký tự nào được sử dụng cho dấu phân tách nhóm và ký tự thập phân.

Chúng tôi có thể truy vấn V$NLS_PARAMETERS xem những ký tự nào đang được sử dụng cho dấu phân tách nhóm và ký tự thập phân:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';

Kết quả:

,.

Ở đây chúng ta thấy rằng ký tự thập phân được biểu thị bằng dấu phẩy và dấu phân tách nhóm được biểu thị bằng dấu chấm.

Bạn có thể thay đổi giá trị của NLS_NUMERIC_CHARACTERS trực tiếp nếu bạn muốn (tức là không thay đổi NLS_TERRITORY tham số).

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Kết quả:

12,345.00

Nhưng có lẽ bạn nên tránh làm điều này, vì nó gây ra sự ngắt kết nối giữa các tham số NLS. Các thông số NLS của bạn không còn phản ánh các giá trị mặc định cho lãnh thổ hiện tại. Trừ khi bạn có lý do chính đáng để không làm như vậy, thông thường tốt hơn là bạn nên thay đổi NLS_TERRITORY tham số cho lãnh thổ có liên quan, để các tham số khác cũng có thể được cập nhật thành tham số mặc định cho lãnh thổ mới.

'nlsparam' Đối số

Một điều tôi nên đề cập là T0_CHAR() hàm chấp nhận đối số thứ ba cho phép bạn tạm thời đặt các tham số NLS khác nhau, bao gồm NLS_NUMERIC_CHARACTERS tham số. Khi bạn thực hiện việc này ở cấp hàm, nó không thay đổi giá trị của các tham số đó cho phiên hiện tại.

Đây là một ví dụ:

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT 
    TO_CHAR(12345, 'fm99G999D00') AS "r1",
    TO_CHAR(
        12345, 'fm99G999D00',
        'NLS_NUMERIC_CHARACTERS = ''.,'''
        ) AS "r2",
    TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;

Kết quả:

          r1           r2           r3 
____________ ____________ ____________ 
12.345,00    12,345.00    12.345,00   

Tại đây, tôi đặt lãnh thổ của phiên thành Đức, sau đó gọi là TO_CHAR() ba lần.

  • Cuộc gọi đầu tiên sử dụng các tham số NLS của phiên. Điều này có nghĩa là dấu phân tách nhóm mặc định là một dấu chấm.
  • Trong cuộc gọi thứ hai, tôi đặt NLS_NUMERIC_CHARACTERS của riêng mình một cách rõ ràng tham số từ bên trong hàm. Trong trường hợp này, tôi đặt dấu phân tách nhóm thành dấu phẩy. Việc làm này không ảnh hưởng đến các thông số NLS trong phiên của tôi, như đã thấy trong lần gọi thứ ba.
  • Cuộc gọi thứ ba sử dụng các tham số NLS của phiên, giống như cuộc gọi đầu tiên. Như chúng ta có thể thấy, dấu phân tách nhóm và ký tự thập phân không bị ảnh hưởng bởi thay đổi (tạm thời) mà chúng tôi đã thực hiện trong lần gọi thứ hai.

Dấu phẩy được mã hóa cứng

Một cách khác để thêm dấu phẩy vào một số là mã hóa nó vào mô hình định dạng của bạn.

Ví dụ:

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;

Kết quả:

12,345.00

Trong trường hợp này, tôi đã mã hóa cứng dấu phẩy và dấu chấm. Thực hiện việc này sẽ bỏ qua dấu phân tách nhóm được đặt trong NLS_NUMERIC_CHARACTERS tham số.

Nhiều dấu phẩy

Bạn có thể có nhiều dấu phẩy và / hoặc dấu phân tách nhóm trong một mô hình định dạng.

Ví dụ:

ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;

Kết quả:

123,456,789.00

Vị trí Dấu phẩy Không hợp lệ

Dấu phẩy hoặc dấu phân tách nhóm không được xuất hiện ở bên phải ký tự thập phân hoặc dấu chấm trong mô hình định dạng số.

SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;

Kết quả:

Error report -
ORA-01481: invalid number format model

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OracleDataSource so với Oracle UCP PoolDataSource

  2. Oracle.ManagedDataAccess.EntityFramework - ORA-01918:người dùng 'dbo' không tồn tại

  3. Làm thế nào tôi có thể nhận được số ngày giữa 2 ngày trong Oracle 11g?

  4. thay đổi cột thả bảng trong cơ sở dữ liệu oracle

  5. Quy trình do người dùng xác định với DBMS_STATS, Phần II