sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man tillämpar villkorlig formatering på ett nummer i SQL Server med FORMAT()

Kanske en av de mindre kända funktionerna i FORMAT() funktion i SQL Server är en som gör att du kan tillämpa villkorlig formatering på ett nummer.

Det är mer en .NET-funktion än en SQL Server- (eller T-SQL)-funktion, men SQL Server/T-SQL stöder det på samma sätt, vilket gör att du kan dra full nytta av möjligheten att tillämpa villkorlig formatering på tal.

Allt beror på formatsträngen du skickar till FORMAT() fungera.

Du kan skicka en formatsträng som anger hur talet ska formateras, beroende på om det är positivt, negativt eller noll.

Bara för att vara tydlig, jag pratar inte om att formatera numret med färger eller teckensnitt etc. Jag pratar enbart om sifferformateringen som du normalt skulle använda FORMAT() funktion för (som att lägga till tusentals avgränsare, procenttecken, decimaler, etc).

Denna villkorliga formatering är också ganska begränsad - endast tre villkor kan testas för (positivt, negativt eller noll). Du kan dock även tillämpa samma formatering på två villkor samtidigt om det behövs.

Hur som helst, så här använder du FORMAT() funktion för att tillämpa villkorlig formatering på ett tal i SQL Server.

Vi presenterar ; – Sektionsavskiljaren

.NET definierar semikolon (; ) som en av dess anpassade numeriska formatspecifikationer, hänvisad till som sektionsavgränsaren .

Sektionsavgränsaren är en villkorsformatspecifikation som definierar sektioner med separata formatsträngar för positiva, negativa och nolltal. Detta gör att du kan tillämpa olika formatering på ett tal beroende på om dess värde är positivt, negativt eller noll.

En sträng med anpassat numeriskt format kan innehålla upp till tre sektioner separerade med semikolon. Dessa är följande:

  • Ett avsnitt :Ingen villkorlig formatering gäller i detta fall. Formatsträngen gäller för alla värden. Ingen sektionsavskiljare behövs (eftersom det bara finns en sektion). Utan tvekan är detta den vanligaste formen av formatsträng.
  • Två avsnitt :Det första avsnittet gäller positiva värden och nollor, och det andra avsnittet gäller negativa värden.

    Om talet som ska formateras är negativt, men blir noll efter avrundning enligt formatet i den andra delen, formateras den resulterande nollan enligt den första delen.

  • Tre avsnitt :Det första avsnittet gäller positiva värden, det andra avsnittet gäller negativa värden och det tredje avsnittet gäller nollor.

    Den andra sektionen kan lämnas tom (genom att inte ha något mellan semikolon), i vilket fall den första sektionen gäller för alla värden som inte är noll.

    Om talet som ska formateras inte är noll, men blir noll efter avrundning enligt formatet i den första eller andra delen, formateras den resulterande nollan enligt den tredje delen.

Observera att negativa värden alltid visas utan ett minustecken när sektionsavgränsare används (även om det finns undantag, som du kommer att se senare). Om du vill att det slutliga formaterade värdet ska ha ett minustecken, måste du uttryckligen inkludera minustecknet som en del av den anpassade formatsträngen. Detta gäller även för all annan befintlig formatering som är kopplad till ett nummer.

Exempel 1 – En sektion (ingen villkorlig formatering)

Här är en typisk numerisk formatsträng som består av en sektion. Inga avsnittsavgränsare används och därför ingen villkorlig formatering gäller .

Kod:

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

Resultat:

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

Lägg märke till att minustecknet förblir intakt. Detta skulle ha tagits bort om vi hade använt sektionsavgränsare.

Exempel 2 – Två sektioner (villkorlig formatering)

Här börjar den villkorliga formateringen.

I det här exemplet har vi två sektioner (separerade med en sektionsavgränsare). Sektionen till vänster om avgränsaren gäller endast värden som är antingen positiva eller noll. Avsnittet till höger gäller endast negativa värden.

Kod:

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

Resultat:

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

I det här fallet var siffran positivt, så det första avsnittet användes för att formatera det.

Exempel 3 – Två sektioner (samma formatsträng, olika värden)

I nästa exempel tillämpas samma formatsträng på olika värden (positiva, negativa och noll).

Kod:

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;

Resultat:

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

Så det här exemplet visar den verkliga fördelen med sektionsavskiljare – att vi kan få ett annat resultat beroende på värdet.

Exempel 4 – Två sektioner med avrundning

När du använder två sektioner, formateras alla negativa värden som avrundas till noll under den första formatsträngen.

Kod:

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

Resultat:

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

Exempel 5 – Tre sektioner (grundläggande användning)

Här är ett grundläggande exempel på att specificera tre sektioner. Vi använder två sektionsseparatorer för att uppnå detta.

Kod:

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

Resultat:

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

I det här fallet var talet ett positivt värde, så det formaterades under det första avsnittet.

Exempel 6 – Tre sektioner (samma formatsträng, olika värden)

Det här exemplet visar de olika resultat vi kunde få från föregående exempel, beroende på inmatningsvärdet.

Här tillämpas samma formatsträng på olika värden. Jag tilldelar även formatsträngen till en variabel, men detta är bara för att göra det lättare att läsa.

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

Resultat:

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

Exempel 7 – Tre sektioner (inklusive en tom)

Om du lämnar den andra formatsträngen tom, gäller det första avsnittet för alla värden som inte är noll. För att lämna det tomt, lämna bara ingenting mellan semikolon.

Kod:

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

Resultat:

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

Intressant nog, i det här fallet lämnas minustecknet för det negativa värdet intakt.

Exempel 8 – Minustecknet

Som nämnts ignorerar sektionsavgränsaren all befintlig formatering som är associerad med numret. Detta inkluderar alla minustecken för negativa värden (även om det föregående exemplet verkar vara ett undantag från detta).

Om du vill inkludera minustecknet måste du uttryckligen lägga till det i din formatsträng. Exempel nedan.

Kod:

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

Resultat:

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

Som påpekats verkar det tidigare exemplet vara ett undantag från detta, så något att tänka på. Så här händer om jag lägger till ett minustecken i formatsträngen för det negativa värdet i föregående exempel:

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

Resultat:

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

  1. Implementera MariaDB-replikering för hög tillgänglighet

  2. Hur beräknar man ett exponentiellt glidande medelvärde på postgres?

  3. Hur Postgresql KOPIERA TILL STDIN Med CSV gör om konflikter gör uppdatering?

  4. MySQL DELETE FROM med subquery som villkor