Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да форматирате отрицателни стойности със скоби в SQL Server (T-SQL)

Ето един бърз начин да добавите скоби около отрицателни числа в SQL Server, когато използвате FORMAT() функция.

Целта тук е скоби да се добавят само към отрицателни стойности. Не се добавят скоби към положителни стойности или нули. Освен това скобите заместват всеки знак минус, който иначе би се показал (с други думи, не се показва знак минус, когато се използват скобите).

Въпреки че форматирането често е най-добре да се остави на слоя за презентация, може да има случаи, които диктуват T-SQL решение в SQL Server. В такива случаи се надяваме, че тази статия ще помогне.

Пример 1 – Автоматични скоби

Както споменахме, решенията в тази статия използват FORMAT() функция. Тази функция форматира числова (или дата/час) стойност, след което връща форматирано низово представяне на тази стойност.

Когато извиквате тази функция, вие предавате стойността, която трябва да бъде форматирана, и форматиращ низ, който определя как ще бъде форматиран. Можете също да предоставите трети аргумент, за да дефинирате локала/културата, който да използвате за изхода.

Това, което искам да кажа, е, че има някои случаи, когато FORMAT() автоматично ще обгражда отрицателните стойности със скоби, в зависимост от използвания форматен низ и култура.

Ето пример за форматиране на число като валута с помощта на два различни аргумента „култура“:

SELECT 
  FORMAT(-1.23, 'C', 'en-us') 'en-us',
  FORMAT(-1.23, 'C', 'en-gb') 'en-gb';

Резултат:

+---------+---------+
| en-us   | en-gb   |
|---------+---------|
| ($1.23) | -£1.23  |
+---------+---------+

В този случай това е комбинация от форматен низ и култура, която определя дали отрицателните стойности са заобиколени от скоби или не.

C е стандартен спецификатор на числов формат, който форматира числото като валута. Когато се използва този спецификатор на формат, точният изход се определя от културата. Това е така, защото различните култури използват различни конвенции за показване на валутни суми. Културата ще определи действителния символ на валута, който ще се използва, неговото разположение, както и начина, по който се показват отрицателните стойности.

Ако не посочите култура, ще се използва езикът на текущата сесия. Това обикновено е езикът по подразбиране за потребителя, но може да бъде променен и с SET LANGUAGE изявление.

Пример 2 – Условно форматиране

Ако низ от стандартен формат не предоставя нужните резултати, вместо това ще трябва да използвате персонализиран низ с числов формат.

Ето пример за използване на низ с персонализиран цифров формат за затваряне на резултата в скоби:

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

Резултат:

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

За да постигнем желаните резултати, форматиращият низ използва разделител на раздели, за да осигури условно форматиране.

Условното форматиране е мястото, където задавате различен формат, в зависимост от дадено условие. Когато използвате FORMAT() функция, можете да използвате условно форматиране, за да приложите различно форматиране към число, в зависимост от това дали това число е положително, отрицателно или нула.

В този контекст условното форматиране става възможно чрез точката и запетаята (; ). Това се нарича „разделител на раздели“. В този случай използвах само една точка и запетая, защото искам само две секции (за да правя разлика между отрицателни и неотрицателни).

Когато са включени само две секции, първият раздел се прилага както за положителни стойности, така и за нули. Вторият раздел се отнася за отрицателни стойности. Можете също да добавите друга точка и запетая, за да посочите друг формат само за нули (повече за това по-долу).

Пример 3 – В сравнение с положителен и нула

Ето още един пример, този път включвам положителна стойност и нула (само за да демонстрирам идеята по-ясно).

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

Резултат:

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

Пример 4 – Алтернативно форматиране

Не сте ограничени само до скоби. Можете да използвате къдрави скоби например, квадратни скоби или почти всичко, което ви харесва.

SELECT 
  FORMAT(-123, '0; {0}') R1,
  FORMAT(-123, '0; [0]') R2,
  FORMAT(-123, '0; WARNING! NEGATIVE VALUE!!!') R3;

Резултат:

+--------+--------+-----------------------------+
| R1     | R2     | R3                          |
|--------+--------+-----------------------------|
|  {123} |  [123] |  WARNING! NEGATIVE VALUE!!! |
+--------+--------+-----------------------------+

Пример 5 – Три условия

Както споменахме, можете също да добавите трето условие, за да осигурите отделно форматиране за нули. Ето един бърз пример:

SELECT 
  FORMAT(-123, '0; (0); 0 (Zero)') R1,
  FORMAT(123, '0; (0); 0 (Zero)') R2,
  FORMAT(0, '0; (0); 0 (Zero)') R3;

Резултат:

+--------+------+-----------+
| R1     | R2   | R3        |
|--------+------+-----------|
|  (123) | 123  |  0 (Zero) |
+--------+------+-----------+

Пример 6 – Къде е знакът минус?

Може би сте забелязали, че знакът минус дори не се е появил на отрицателните стойности. Това е така, защото разделителят на раздели игнорира всяко съществуващо форматиране на стойност (включително всички знаци минус). Това означава, че ако използвате условно форматиране и всъщност искате знака минус за отрицателни стойности, ще трябва да го добавите във вашия форматен низ:

SELECT 
  FORMAT(-123, '0; 0 (Negative); 0 (Zero)') 'Without Minus Sign',
  FORMAT(-123, '0; -0 (Negative); 0 (Zero)') 'With Minus Sign';

Резултат:

+----------------------+-------------------+
| Without Minus Sign   | With Minus Sign   |
|----------------------+-------------------|
|  123 (Negative)      |  -123 (Negative)  |
+----------------------+-------------------+

Има обаче някои случаи, в които знакът минус остава непокътнат (поне в моята система):

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

Резултат:

+------------+------------+
| Positive   | Negative   |
|------------+------------|
| 123        | -123       |
+------------+------------+

В този пример отрицателните и положителните стойности споделят една и съща секция. Това е така, защото добавих разделител на секции за отрицателни стойности, но го оставих празен. В този случай низът за форматиране в първия раздел се прилага както за положителните и отрицателни стойности.

Както бе споменато, в този случай знакът минус остава непокътнат за отрицателни стойности.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дизайн на база данни за потребителски настройки

  2. Как да коригирате „името на профила не е валидно“ при актуализиране на пощенски профил на база данни в SQL Server (T-SQL)

  3. Използване на съхранени процедури на SQL Server от Python (pyodbc)

  4. Каква е ползата от GO в SQL Server Management Studio &Transact SQL?

  5. Задействане за предотвратяване на вмъкване за дублиращи се данни от две колони