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

Cách áp dụng định dạng có điều kiện cho một số trong SQL Server bằng cách sử dụng FORMAT ()

Có lẽ một trong những tính năng ít được biết đến của FORMAT() trong SQL Server là một hàm cho phép bạn áp dụng định dạng có điều kiện cho một số.

Đây là tính năng của .NET nhiều hơn là tính năng của SQL Server (hoặc T-SQL), nhưng SQL Server / T-SQL hỗ trợ tất cả các tính năng này, cho phép bạn tận dụng tối đa khả năng áp dụng định dạng có điều kiện cho các số.

Tất cả phụ thuộc vào chuỗi định dạng bạn chuyển vào FORMAT() hàm số.

Bạn có thể chuyển một chuỗi định dạng chỉ định cách định dạng số, tùy thuộc vào đó là số dương, số âm hay số không.

Nói rõ hơn, tôi không nói về định dạng số bằng màu sắc hoặc phông chữ, v.v. Tôi chỉ nói về định dạng số mà bạn thường sử dụng FORMAT() chức năng cho (chẳng hạn như thêm dấu phân cách hàng nghìn, dấu phần trăm, dấu thập phân, v.v.).

Ngoài ra, định dạng có điều kiện này khá hạn chế - chỉ có thể kiểm tra ba điều kiện (tích cực, tiêu cực hoặc không). Tuy nhiên, bạn cũng có thể áp dụng cùng một định dạng cho hai điều kiện cùng một lúc nếu được yêu cầu.

Trong mọi trường hợp, đây là cách sử dụng FORMAT() để áp dụng định dạng có điều kiện cho một số trong SQL Server.

Giới thiệu ; - Dấu phân cách phần

.NET định nghĩa dấu chấm phẩy (; ) là một trong những chỉ định định dạng số tùy chỉnh của nó, được gọi là dấu phân tách phần .

Dấu phân tách phần là công cụ định dạng có điều kiện xác định các phần có chuỗi định dạng riêng biệt cho số dương, số âm và số 0. Điều này cho phép bạn áp dụng các định dạng khác nhau cho một số tùy thuộc vào việc giá trị của nó là dương, âm hay 0.

Một chuỗi định dạng số tùy chỉnh có thể chứa tối đa ba phần được phân tách bằng dấu chấm phẩy. Những điều này như sau:

  • Một phần :Không áp dụng định dạng có điều kiện trong trường hợp này. Chuỗi định dạng áp dụng cho tất cả các giá trị. Không cần dấu phân cách phần (vì chỉ có một phần). Không nghi ngờ gì nữa, đây là dạng chuỗi định dạng phổ biến nhất.
  • Hai phần :Phần đầu tiên áp dụng cho các giá trị dương và số không, và phần thứ hai áp dụng cho các giá trị âm.

    Nếu số được định dạng là số âm, nhưng trở thành số 0 sau khi làm tròn theo định dạng trong phần thứ hai, thì số 0 kết quả sẽ được định dạng theo phần đầu tiên.

  • Ba phần :Phần đầu tiên áp dụng cho các giá trị dương, phần thứ hai áp dụng cho các giá trị âm và phần thứ ba áp dụng cho các số không.

    Phần thứ hai có thể để trống (do không có gì giữa các dấu chấm phẩy), trong trường hợp đó, phần đầu tiên áp dụng cho tất cả các giá trị khác không.

    Nếu số được định dạng khác không, nhưng trở thành số 0 sau khi làm tròn theo định dạng trong phần thứ nhất hoặc thứ hai, thì số 0 kết quả sẽ được định dạng theo phần thứ ba.

Lưu ý rằng các giá trị âm luôn được hiển thị mà không có dấu trừ khi sử dụng dấu phân cách phần (mặc dù vẫn có ngoại lệ, như bạn sẽ thấy sau). Nếu bạn muốn giá trị được định dạng cuối cùng có dấu trừ, bạn cần phải bao gồm dấu trừ một cách rõ ràng như một phần của chuỗi định dạng tùy chỉnh. Điều này cũng áp dụng cho bất kỳ định dạng có sẵn nào khác được liên kết với một số.

Ví dụ 1 - Một phần (không có định dạng có điều kiện)

Đây là một chuỗi định dạng số điển hình bao gồm một phần. Không có dấu phân tách phần nào được sử dụng và do đó không áp dụng định dạng có điều kiện .

Mã:

SELECT 
  FORMAT(123, '0 (Number)') Positive,
  FORMAT(-123, '0 (Number)') Negative,
  FORMAT(0, '0 (Number)') Zero;

Kết quả:

+--------------+---------------+------------+
| Positive     | Negative      | Zero       |
|--------------+---------------+------------|
| 123 (Number) | -123 (Number) | 0 (Number) |
+--------------+---------------+------------+

Chú ý rằng dấu trừ vẫn còn nguyên. Điều này sẽ bị xóa nếu chúng tôi sử dụng dấu phân tách phần.

Ví dụ 2 - Hai phần (định dạng có điều kiện)

Đây là nơi bắt đầu định dạng có điều kiện.

Trong ví dụ này, chúng ta có hai phần (được phân tách bằng một dấu phân cách phần). Phần bên trái của dấu phân cách chỉ áp dụng cho các giá trị dương hoặc bằng không. Phần bên phải chỉ áp dụng cho các giá trị âm.

Mã:

SELECT FORMAT(123,  '0 (Positive or Zero); 0 (Negative)') Result;

Kết quả:

+------------------------+
| Result                 |
|------------------------|
| 123 (Positive or Zero) |
+------------------------+

Trong trường hợp này, con số là số dương, vì vậy phần đầu tiên được sử dụng để định dạng nó.

Ví dụ 3 - Hai Phần (chuỗi định dạng giống nhau, các giá trị khác nhau)

Trong ví dụ tiếp theo, cùng một chuỗi định dạng được áp dụng cho các giá trị khác nhau (dương, âm và không).

Mã:

SELECT 
  FORMAT(123,  '0 (Positive or Zero); 0 (Negative)') Positive,
  FORMAT(-123, '0 (Positive or Zero); 0 (Negative)') Negative,
  FORMAT(0,    '0 (Positive or Zero); 0 (Negative)') Zero;

Kết quả:

+------------------------+-----------------+----------------------+
| Positive               | Negative        | Zero                 |
|------------------------+-----------------+----------------------|
| 123 (Positive or Zero) |  123 (Negative) | 0 (Positive or Zero) |
+------------------------+-----------------+----------------------+

Vì vậy, ví dụ này chứng minh lợi ích thực sự của dấu phân tách phần - rằng chúng ta có thể nhận được một kết quả khác tùy thuộc vào giá trị.

Ví dụ 4 - Hai phần có làm tròn

Khi sử dụng hai phần, bất kỳ giá trị âm nào được làm tròn thành 0 đều được định dạng dưới chuỗi định dạng đầu tiên.

Mã:

SELECT 
  FORMAT(0.1,  '0 (Positive or Zero); 0 (Negative)') Positive,
  FORMAT(-0.1, '0 (Positive or Zero); 0 (Negative)') Negative;

Kết quả:

+----------------------+----------------------+
| Positive             | Negative             |
|----------------------+----------------------|
| 0 (Positive or Zero) | 0 (Positive or Zero) |
+----------------------+----------------------+

Ví dụ 5 - Ba phần (cách sử dụng cơ bản)

Dưới đây là một ví dụ cơ bản về việc chỉ định ba phần. Chúng tôi sử dụng hai dấu phân tách phần để đạt được điều này.

Mã:

SELECT FORMAT(123, '0 (Positive); 0 (Negative); 0 (Zero)') Result;

Kết quả:

+----------------+
| Result         |
|----------------|
| 123 (Positive) |
+----------------+

Trong trường hợp này, số là một giá trị dương, vì vậy nó được định dạng trong phần đầu tiên.

Ví dụ 6 - Ba phần (chuỗi định dạng giống nhau, giá trị khác nhau)

Ví dụ này minh họa các kết quả khác nhau mà chúng ta có thể nhận được từ ví dụ trước, tùy thuộc vào giá trị đầu vào.

Ở đây, cùng một chuỗi định dạng được áp dụng cho các giá trị khác nhau. Tôi cũng gán chuỗi định dạng cho một biến, nhưng điều này chỉ để làm cho nó dễ đọc hơn.

DECLARE @formatstring varchar(35);
SET @formatstring = '0 (Positive); 0 (Negative); 0 (Zero)';
SELECT 
  FORMAT(123,   @formatstring) 'Positive',
  FORMAT(-123,  @formatstring) 'Negative',
  FORMAT(0,     @formatstring) 'Zero',
  FORMAT(0.123, @formatstring) 'Rounded to Zero';

Kết quả:

+----------------+-----------------+----------+-------------------+
| Positive       | Negative        | Zero     | Rounded to Zero   |
|----------------+-----------------+----------+-------------------|
| 123 (Positive) |  123 (Negative) |  0 (Zero |  0 (Zero          |
+----------------+-----------------+----------+-------------------+

Ví dụ 7 - Ba phần (bao gồm một phần trống)

Nếu bạn để trống chuỗi định dạng thứ hai, phần đầu tiên sẽ áp dụng cho tất cả các giá trị khác không. Để trống, chỉ để trống giữa các dấu chấm phẩy.

Mã:

SELECT 
  FORMAT(123,   '0 (Nonzero);; 0 (Zero)') 'Positive',
  FORMAT(-123,  '0 (Nonzero);; 0 (Zero)') 'Negative',
  FORMAT(0,     '0 (Nonzero);; 0 (Zero)') 'Zero',
  FORMAT(0.123, '0 (Nonzero);; 0 (Zero)') 'Rounded to Zero';

Kết quả:

+---------------+----------------+-----------+-------------------+
| Positive      | Negative       | Zero      | Rounded to Zero   |
|---------------+----------------+-----------+-------------------|
| 123 (Nonzero) | -123 (Nonzero) |  0 (Zero) |  0 (Zero)         |
+---------------+----------------+-----------+-------------------+

Điều thú vị là trong trường hợp này, dấu trừ cho giá trị âm được giữ nguyên.

Ví dụ 8 - Dấu trừ

Như đã đề cập, dấu phân tách phần bỏ qua bất kỳ định dạng có sẵn nào được liên kết với số. Điều này bao gồm bất kỳ dấu trừ nào cho các giá trị âm (mặc dù ví dụ trước dường như là một ngoại lệ cho điều này).

Nếu bạn muốn bao gồm dấu trừ, bạn cần phải thêm dấu trừ một cách rõ ràng vào chuỗi định dạng của mình. Ví dụ bên dưới.

Mã:

SELECT 
  FORMAT(-123, '0 (P); 0 (N); 0 (Z)') 'Without minus sign',
  FORMAT(-123, '0 (P); -0 (N); 0 (Z)') 'With minus sign';

Kết quả:

+----------------------+-------------------+
| Without minus sign   | With minus sign   |
|----------------------+-------------------|
|  123 (N)             |  -123 (N)         |
+----------------------+-------------------+

Như đã chỉ ra, ví dụ trước dường như là một ngoại lệ cho điều này, vì vậy cần lưu ý điều gì đó. Đây là điều sẽ xảy ra nếu tôi thêm dấu trừ vào chuỗi định dạng cho giá trị âm trong ví dụ trước:

SELECT FORMAT(-123,  '-0 (Nonzero);; 0 (Zero)') Result;

Kết quả:

+-----------------+
| Result          |
|-----------------|
| --123 (Nonzero) |
+-----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server SHOW TABLES Tương đương

  2. Cách CAST () hoạt động trong SQL Server

  3. Cách thiết lập đám mây Spotlight và khắc phục sự cố máy chủ SQL một cách hiệu quả

  4. Tránh bế tắc SQL với điều chỉnh truy vấn:Lời khuyên từ Brent Ozar

  5. Cách xóa cột trong SQL Server bằng T-SQL