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

Как да приложите условно форматиране към число в SQL Server с помощта на FORMAT()

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

Това е по-скоро функция на .NET, отколкото функция на SQL Server (или T-SQL), но SQL Server/T-SQL я поддържа все едно, което ви позволява да се възползвате напълно от възможността да прилагате условно форматиране към числата.

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

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

Само за да е ясно, не говоря за форматиране на числото с цветове или шрифтове и т.н. Говоря единствено за форматирането на числата, което обикновено използвате FORMAT() функция за (като добавяне на разделители на хиляди, знаци за проценти, десетични точки и т.н.).

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

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

Представяме ; – Разделителят на раздели

.NET дефинира точката и запетаята (; ) като един от неговите персонализирани спецификатори на цифров формат, наричан разделител на секции .

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

Низът с персонализиран цифров формат може да съдържа до три секции, разделени с точка и запетая. Те са както следва:

  • Една секция :В този случай не се прилага условно форматиране. Форматният низ се прилага за всички стойности. Не е необходим разделител на секции (защото има само една секция). Без съмнение, това е най-често срещаната форма на форматен низ.
  • Две секции :Първият раздел се прилага за положителни стойности и нули, а вторият раздел се прилага за отрицателни стойности.

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

  • Три раздела :Първият раздел се прилага за положителни стойности, вторият раздел се прилага за отрицателни стойности, а третият раздел се прилага за нули.

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

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

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

Пример 1 – Един раздел (без условно форматиране)

Ето типичен низ с числов формат, състоящ се от един раздел. Не се използват разделители на раздели и следователно не се прилага условно форматиране .

Код:

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

Резултат:

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

Забележете, че знакът минус остава непокътнат. Това би било премахнато, ако използвахме разделители на секции.

Пример 2 – Два раздела (условно форматиране)

Ето откъде започва условното форматиране.

В този пример имаме две секции (разделени с един разделител). Секцията вляво от разделителя се прилага само за стойности, които са положителни или нулеви. Разделът вдясно се отнася само за отрицателни стойности.

Код:

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

Резултат:

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

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

Пример 3 – две секции (с един и същ формат низ, различни стойности)

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

Код:

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;

Резултат:

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

Така че този пример демонстрира истинската полза от разделителите на раздели – че можем да получим различен резултат в зависимост от стойността.

Пример 4 – Две секции със закръгляване

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

Код:

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

Резултат:

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

Пример 5 – Три раздела (основна употреба)

Ето основен пример за определяне на три раздела. Използваме два разделителя на секции, за да постигнем това.

Код:

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

Резултат:

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

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

Пример 6 – Три раздела (един и същ форматен низ, различни стойности)

Този пример демонстрира различните резултати, които бихме могли да получим от предишния пример, в зависимост от входната стойност.

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

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';

Резултат:

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

Пример 7 – Три раздела (включително празен)

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

Код:

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';

Резултат:

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

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

Пример 8 – Знакът минус

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

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

Код:

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

Резултат:

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

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

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

Резултат:

+-----------------+
| 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. Съхранена процедура, която експортира данни в csv файлове, експортира само в един файл

  2. как да присвоите стойност на cte на променлива

  3. Как да използвате израза IF/ELSE за актуализиране или създаване на нов запис на xml възел в Sql

  4. Как да свържете текст от множество редове в един текстов низ в SQL Server

  5. Вникване в уникалните ограничения на SQL Server