Đây là một cách nhanh chóng để thêm dấu ngoặc nhọn xung quanh số âm trong SQL Server khi sử dụng FORMAT()
hàm số.
Mục tiêu ở đây là dấu ngoặc chỉ được thêm vào phủ định các giá trị. Không có dấu ngoặc nào được thêm vào giá trị dương hoặc số không. Ngoài ra, dấu ngoặc vuông thay thế bất kỳ dấu trừ nào sẽ được hiển thị (nói cách khác, không có dấu trừ nào được hiển thị khi sử dụng dấu ngoặc).
Mặc dù việc định dạng thường được để cho lớp trình bày tốt nhất, nhưng có thể có những trường hợp chỉ định giải pháp T-SQL trong SQL Server. Trong những trường hợp như vậy, hy vọng bài viết này sẽ giúp ích cho bạn.
Ví dụ 1 - Dấu ngoặc đơn tự động
Như đã đề cập, các giải pháp trong bài viết này sử dụng FORMAT()
hàm số. Hàm này định dạng một giá trị số (hoặc ngày / giờ), sau đó trả về biểu diễn chuỗi được định dạng của giá trị đó.
Khi gọi hàm này, bạn chuyển giá trị cần định dạng và một chuỗi định dạng xác định cách nó sẽ được định dạng. Bạn cũng có thể cung cấp đối số thứ ba để xác định ngôn ngữ / văn hóa sẽ sử dụng cho đầu ra.
Tôi đang giải quyết vấn đề này, có một số trường hợp FORMAT()
sẽ tự động bao quanh các giá trị âm trong dấu ngoặc, tùy thuộc vào chuỗi định dạng và văn hóa đang được sử dụng.
Dưới đây là một ví dụ về định dạng một số dưới dạng đơn vị tiền tệ bằng cách sử dụng hai đối số "văn hóa" khác nhau:
SELECT FORMAT(-1.23, 'C', 'en-us') 'en-us', FORMAT(-1.23, 'C', 'en-gb') 'en-gb';
Kết quả:
+---------+---------+ | en-us | en-gb | |---------+---------| | ($1.23) | -£1.23 | +---------+---------+
Trong trường hợp này, nó là sự kết hợp của chuỗi định dạng và văn hóa xác định xem các giá trị âm có được bao quanh bởi dấu ngoặc đơn hay không.
C
là một công cụ xác định định dạng số tiêu chuẩn, định dạng số dưới dạng đơn vị tiền tệ. Khi định dạng này được sử dụng, đầu ra chính xác sẽ được xác định bởi văn hóa. Điều này là do các nền văn hóa khác nhau sử dụng các quy ước khác nhau để hiển thị số lượng tiền tệ. Văn hóa sẽ xác định ký hiệu tiền tệ thực tế sẽ được sử dụng, vị trí của nó, cũng như cách các giá trị âm được hiển thị.
Nếu bạn không chỉ định văn hóa, ngôn ngữ của phiên hiện tại sẽ được sử dụng. Đây thường là ngôn ngữ mặc định cho người dùng, nhưng nó cũng có thể được thay đổi bằng SET LANGUAGE
tuyên bố.
Ví dụ 2 - Định dạng có điều kiện
Nếu chuỗi định dạng chuẩn không cung cấp kết quả bạn cần, bạn sẽ cần sử dụng chuỗi định dạng số tùy chỉnh để thay thế.
Dưới đây là một ví dụ về việc sử dụng chuỗi định dạng số tùy chỉnh để đặt kết quả trong dấu ngoặc đơn:
SELECT FORMAT(-123, '0; (0)') Result;
Kết quả:
+----------+ | Result | |----------| | (123) | +----------+
Để đạt được kết quả chúng tôi muốn, chuỗi định dạng sử dụng dấu phân tách phần để cung cấp định dạng có điều kiện.
Định dạng có điều kiện là nơi bạn chỉ định một định dạng khác, tùy thuộc vào một điều kiện nhất định. Khi sử dụng FORMAT()
, bạn có thể sử dụng định dạng có điều kiện để áp dụng các định dạng khác nhau cho một số, tùy thuộc vào việc số đó là số dương, số âm hay số không.
Trong ngữ cảnh này, có thể thực hiện định dạng có điều kiện bằng dấu chấm phẩy (;
). Đây được gọi là "dấu phân cách phần". Trong trường hợp này, tôi chỉ sử dụng một dấu chấm phẩy, vì tôi chỉ muốn có hai phần (để phân biệt giữa phủ định và không phủ định).
Khi chỉ có hai phần được bao gồm, phần đầu tiên áp dụng cho cả giá trị dương và số không. Phần thứ hai áp dụng cho các giá trị âm. Bạn cũng có thể thêm một dấu chấm phẩy khác để chỉ định một định dạng khác chỉ dành cho số không (thêm về định dạng bên dưới).
Ví dụ 3 - So sánh với Tích cực và Bằng không
Đây là một ví dụ khác, lần này tôi bao gồm giá trị dương và giá trị 0 (chỉ để chứng minh quan điểm rõ ràng hơn).
SELECT FORMAT(-123, '0; (0)') Negative, FORMAT(123, '0; (0)') Positive, FORMAT(0, '0; (0)') Zero;
Kết quả:
+------------+------------+--------+ | Negative | Positive | Zero | |------------+------------+--------| | (123) | 123 | 0 | +------------+------------+--------+
Ví dụ 4 - Định dạng Thay thế
Bạn không bị giới hạn chỉ trong dấu ngoặc đơn. Ví dụ, bạn có thể sử dụng dấu ngoặc nhọn hoặc dấu ngoặc vuông, hoặc hầu hết bất kỳ thứ gì bạn thích.
SELECT FORMAT(-123, '0; {0}') R1, FORMAT(-123, '0; [0]') R2, FORMAT(-123, '0; WARNING! NEGATIVE VALUE!!!') R3;
Kết quả:
+--------+--------+-----------------------------+ | R1 | R2 | R3 | |--------+--------+-----------------------------| | {123} | [123] | WARNING! NEGATIVE VALUE!!! | +--------+--------+-----------------------------+
Ví dụ 5 - Ba điều kiện
Như đã đề cập, bạn cũng có thể thêm điều kiện thứ ba để cung cấp định dạng riêng cho các số không. Dưới đây là một ví dụ nhanh:
SELECT FORMAT(-123, '0; (0); 0 (Zero)') R1, FORMAT(123, '0; (0); 0 (Zero)') R2, FORMAT(0, '0; (0); 0 (Zero)') R3;
Kết quả:
+--------+------+-----------+ | R1 | R2 | R3 | |--------+------+-----------| | (123) | 123 | 0 (Zero) | +--------+------+-----------+
Ví dụ 6 - Dấu trừ ở đâu?
Bạn có thể nhận thấy rằng dấu trừ thậm chí còn chưa xuất hiện trên các giá trị âm. Điều này là do dấu phân tách phần bỏ qua bất kỳ định dạng có sẵn nào trên một giá trị (bao gồm bất kỳ dấu trừ nào). Điều này có nghĩa là, nếu bạn đang sử dụng định dạng có điều kiện và bạn thực sự muốn có dấu trừ trên các giá trị âm, bạn sẽ cần thêm nó vào chuỗi định dạng của mình:
SELECT FORMAT(-123, '0; 0 (Negative); 0 (Zero)') 'Without Minus Sign', FORMAT(-123, '0; -0 (Negative); 0 (Zero)') 'With Minus Sign';
Kết quả:
+----------------------+-------------------+ | Without Minus Sign | With Minus Sign | |----------------------+-------------------| | 123 (Negative) | -123 (Negative) | +----------------------+-------------------+
Tuy nhiên, có một số trường hợp dấu trừ vẫn còn nguyên (ít nhất là trên hệ thống của tôi):
SELECT FORMAT(123, '0;; 0 (Zero)') Positive, FORMAT(-123, '0;; 0 (Zero)') Negative;
Kết quả:
+------------+------------+ | Positive | Negative | |------------+------------| | 123 | -123 | +------------+------------+
Trong ví dụ này, các giá trị âm và dương có cùng một phần. Điều này là do tôi đã thêm dấu phân tách phần cho các giá trị âm nhưng lại để trống. Trong trường hợp này, chuỗi định dạng trong phần đầu tiên áp dụng cho cả và dương giá trị âm.
Như đã đề cập, trong trường hợp này, dấu trừ vẫn còn nguyên đối với các giá trị âm.