Trong Cơ sở dữ liệu Oracle, TO_CHAR(number)
hàm chuyển đổi một số thành VARCHAR2
giá trị ở định dạng được chỉ định bởi đối số định dạng.
Cú pháp
Cú pháp như sau:
TO_CHAR(n [, fmt [, 'nlsparam' ] ])
Ở đâu:
-
n
có thể thuộc loạiNUMBER
,BINARY_FLOAT
hoặcBINARY_DOUBLE
. -
fmt
là một mô hình định dạng tùy chọn chỉ định cách định dạng kết quả. Xem các phần tử định dạng số hợp lệ có thể được sử dụng để xây dựng mô hình định dạng của bạn. -
'nlsparam'
là một đối số tùy chọn chỉ định cách trả về các ký tự khác nhau. Bạn có thể sử dụng nó để chỉ định ký tự thập phân và dấu phân tách nhóm, ký hiệu nội tệ và ký hiệu tiền tệ quốc tế. Nếu đối số này bị bỏ qua thì các giá trị mặc định cho phiên hiện tại sẽ được sử dụng.
Ví dụ
Dưới đây là một ví dụ để chứng minh cách hoạt động của hàm:
SELECT TO_CHAR(12345, '99G999') AS Result
FROM DUAL;
Kết quả:
RESULT __________ 12,345
Đối số đầu tiên là số thực mà chúng tôi đang định dạng và đối số thứ hai là mô hình định dạng. Mô hình định dạng chỉ định cách số được định dạng.
Trong trường hợp này, mô hình định dạng của chúng tôi định dạng số bằng dấu phân tách nhóm ở vị trí thích hợp. Mỗi chữ số được biểu thị bằng 9
và dấu phân tách nhóm được biểu thị bằng G
.
Dưới đây là những gì sẽ xảy ra nếu chúng tôi thay đổi một chút mô hình định dạng:
SELECT TO_CHAR(12345, '099G999') AS Result
FROM DUAL;
Kết quả:
RESULT ___________ 012,345
Trong trường hợp này, chúng tôi bắt đầu mô hình định dạng bằng 0
tính cách. Điều này trả về số 0 ở đầu bất cứ nơi nào có thể áp dụng. 9
ký tự không trả về các số 0 ở đầu.
Trên thực tế, chúng tôi có thể thay thế tất cả 9
s với 0
s nếu chúng ta muốn. Dưới đây là một so sánh cho thấy kết quả có thể khác nhau đáng kể như thế nào, tùy thuộc vào yếu tố định dạng bạn sử dụng:
SELECT
TO_CHAR(12, '000G000') AS "000G000",
TO_CHAR(12, '999G999') AS "999G999"
FROM DUAL;
Kết quả:
000G000 999G999 ___________ ___________ 000,012 12
Ký hiệu tiền tệ
Bạn có thể sử dụng L
phần tử định dạng để trả về ký hiệu nội tệ.
Ví dụ:
SELECT TO_CHAR(12345, 'L99G999D99') AS Result
FROM DUAL;
Kết quả:
RESULT _______________________ $12,345.00
Ví dụ này sử dụng mô hình định dạng xuất ra kết quả bằng ký hiệu nội tệ (được đại diện bởi L
), dấu phân tách nhóm (được đại diện bởi G
), một ký tự thập phân (được đại diện bởi D
), và tất nhiên, mỗi chữ số (được đại diện bởi 9
).
Ký hiệu nội tệ được xác định bằng giá trị hiện tại của NLS_CURRENCY
tham số. Đúng là chúng tôi có thể đã sử dụng ký hiệu đô la ($
) đối với ký hiệu tiền tệ, nhưng điều đó giả định rằng đơn vị tiền tệ đó được tính bằng đô la. Có nhiều loại tiền tệ khả dụng khác trên khắp thế giới và L
phần tử định dạng có thể tự động trả lại ký hiệu nội tệ cho phiên của người dùng.
Xem Cách Kiểm tra Giá trị của Tham số NLS nếu bạn cần kiểm tra.
Xem Danh sách đầy đủ các phần tử định dạng số này trong Oracle để biết danh sách các phần tử định dạng có thể được sử dụng để định dạng số bằng hàm này.
Định dạng mặc định
Nếu bạn bỏ qua fmt
đối số, số được chuyển đổi thành VARCHAR2
giá trị đủ dài chính xác để chứa các chữ số có nghĩa của nó.
Dưới đây là một ví dụ về chuyển đổi một số mà không chỉ định định dạng:
SELECT TO_CHAR(525.45)
FROM DUAL;
Kết quả:
525.45
'nlsparam'
Đối số
'nlsparam'
đối số có thể được sử dụng để chỉ định ký tự thập phân và dấu phân tách nhóm, ký hiệu nội tệ và ký hiệu tiền tệ quốc tế.
Nó có dạng sau:
'NLS_NUMERIC_CHARACTERS = ''dg''
NLS_CURRENCY = ''text''
NLS_ISO_CURRENCY = territory '
Ví dụ:
SELECT
TO_CHAR(
1234.56,
'L99G999D99',
'NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''€''
NLS_ISO_CURRENCY = Germany'
)
FROM DUAL;
Kết quả:
€1.234,56
Đây là một lần nữa, nhưng lần này tôi thay thế L
với C
trong mô hình định dạng:
SELECT
TO_CHAR(
1234.56,
'C99G999D99',
'NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''€''
NLS_ISO_CURRENCY = Germany'
)
FROM DUAL;
Kết quả:
EUR1.234,56
C
trả về ký hiệu tiền tệ ISO, trong trường hợp này là EUR
.
Cách loại bỏ đệm
Bạn có thể nhận thấy rằng một số ví dụ có phần đệm được áp dụng ở bên trái kết quả. Phần đệm như vậy có thể được loại bỏ bằng fm
công cụ sửa đổi định dạng.
Ví dụ:
SELECT
TO_CHAR(
1234.56,
'fmL99G999D99',
'NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''€''
NLS_ISO_CURRENCY = Germany'
)
FROM DUAL;
Kết quả:
€1.234,56
Đối số rỗng
Chuyển null
kết quả là null
:
SET NULL 'null';
SELECT TO_CHAR(null)
FROM DUAL;
Kết quả:
null
Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào null
xảy ra do một SELECT
trong SQL tuyên bố.
Tuy nhiên, bạn có thể sử dụng SET NULL
để chỉ định một chuỗi khác được trả về. Ở đây tôi đã chỉ định rằng chuỗi null
nên được trả lại.
Thiếu đối số
Gọi hàm mà không chuyển bất kỳ đối số nào, dẫn đến lỗi:
SELECT TO_CHAR()
FROM DUAL;
Kết quả:
SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
Chuyển quá nhiều đối số cũng dẫn đến lỗi:
SELECT TO_CHAR(123, '99', 'NLS_ISO_CURRENCY = GERMANY', 'oops!' )
FROM DUAL;
Kết quả:
SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function"