sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan anvender du betinget formatering på et tal i SQL Server ved hjælp af FORMAT()

Måske en af ​​de mindre kendte funktioner i FORMAT() funktion i SQL Server er en, der giver dig mulighed for at anvende betinget formatering på et tal.

Det er mere en .NET-funktion, end det er en SQL Server-funktion (eller T-SQL), men SQL Server/T-SQL understøtter det hele, så du kan drage fuld fordel af muligheden for at anvende betinget formatering på tal.

Det hele kommer ned til den formatstreng, du sender til FORMAT() fungere.

Du kan sende en formatstreng, der angiver, hvordan tallet skal formateres, afhængigt af om det er positivt, negativt eller nul.

Bare for at være klar, jeg taler ikke om formatering af tallet med farver eller skrifttyper osv. Jeg taler udelukkende om den talformatering, som du normalt ville bruge FORMAT() funktion for (såsom tilføjelse af tusinde separatorer, procenttegn, decimaler osv.).

Denne betingede formatering er også ret begrænset - kun tre betingelser kan testes for (positiv, negativ eller nul). Du kan dog også anvende den samme formatering på to forhold på én gang, hvis det kræves.

Under alle omstændigheder, her er, hvordan du bruger FORMAT() funktion til at anvende betinget formatering på et tal i SQL Server.

Vi introducerer ; – Sektionsseparatoren

.NET definerer semikolon (; ) som en af ​​dens brugerdefinerede numeriske formatspecifikationer, kaldet sektionsseparatoren .

Sektionsseparatoren er en betinget formatangivelse, der definerer sektioner med separate formatstrenge for positive, negative og nultal. Dette giver dig mulighed for at anvende forskellig formatering på et tal, afhængigt af om dets værdi er positiv, negativ eller nul.

En streng med tilpasset numerisk format kan indeholde op til tre sektioner adskilt af semikolon. Disse er som følger:

  • Én sektion :Ingen betinget formatering gælder i dette tilfælde. Formatstrengen gælder for alle værdier. Ingen sektionsadskiller er nødvendig (fordi der kun er én sektion). Ingen tvivl om, at dette er den mest almindelige form for formatstreng.
  • To sektioner :Det første afsnit gælder for positive værdier og nuller, og det andet afsnit gælder for negative værdier.

    Hvis det tal, der skal formateres, er negativt, men bliver nul efter afrunding i henhold til formatet i den anden sektion, formateres det resulterende nul i overensstemmelse med den første sektion.

  • Tre sektioner :Det første afsnit gælder for positive værdier, det andet afsnit gælder for negative værdier, og det tredje afsnit gælder for nuller.

    Den anden sektion kan efterlades tom (ved at der ikke er noget mellem semikolonerne), i hvilket tilfælde den første sektion gælder for alle værdier, der ikke er nul.

    Hvis det tal, der skal formateres, ikke er nul, men bliver nul efter afrunding i henhold til formatet i den første eller anden sektion, formateres det resulterende nul i overensstemmelse med den tredje sektion.

Bemærk, at negative værdier altid vises uden et minustegn, når der bruges sektionsseparatorer (selvom der er undtagelser, som du vil se senere). Hvis du ønsker, at den endelige formaterede værdi skal have et minustegn, skal du udtrykkeligt inkludere minustegnet som en del af den tilpassede formatstreng. Dette gælder også for enhver anden allerede eksisterende formatering forbundet med et nummer.

Eksempel 1 – Ét afsnit (ingen betinget formatering)

Her er en typisk numerisk formatstreng bestående af én sektion. Der bruges ingen sektionsseparatorer, og derfor gælder ingen betinget formatering .

Kode:

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) |
+--------------+---------------+------------+

Bemærk, at minustegnet forbliver intakt. Dette ville være blevet fjernet, hvis vi havde brugt sektionsseparatorer.

Eksempel 2 – To sektioner (betinget formatering)

Her starter den betingede formatering.

I dette eksempel har vi to sektioner (adskilt af en sektionsseparator). Afsnittet til venstre for separatoren gælder kun for værdier, der er enten positive eller nul. Afsnittet til højre gælder kun for negative værdier.

Kode:

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

Resultat:

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

I dette tilfælde var tallet positivt, så den første sektion blev brugt til at formatere det.

Eksempel 3 – To sektioner (samme formatstreng, forskellige værdier)

I det næste eksempel anvendes den samme formatstreng på forskellige værdier (positive, negative og nul).

Kode:

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å dette eksempel viser den sande fordel ved sektionsseparatorer – at vi kan få et andet resultat afhængigt af værdien.

Eksempel 4 – To sektioner med afrunding

Når du bruger to sektioner, formateres eventuelle negative værdier, der er afrundet til nul, under den første formatstreng.

Kode:

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) |
+----------------------+----------------------+

Eksempel 5 – Tre sektioner (grundlæggende brug)

Her er et grundlæggende eksempel på at specificere tre sektioner. Vi bruger to sektionsseparatorer for at opnå dette.

Kode:

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

Resultat:

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

I dette tilfælde var tallet en positiv værdi, så det blev formateret under den første sektion.

Eksempel 6 – Tre sektioner (samme formatstreng, forskellige værdier)

Dette eksempel viser de forskellige resultater, vi kunne få fra det foregående eksempel, afhængigt af inputværdien.

Her anvendes den samme formatstreng på forskellige værdier. Jeg tildeler også formatstrengen til en variabel, men dette er blot for at gøre det nemmere at læse.

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          |
+----------------+-----------------+----------+-------------------+

Eksempel 7 – Tre sektioner (inklusive en tom)

Hvis du lader den anden formatstreng være tom, gælder den første sektion for alle værdier, der ikke er nul. For at lade det være tomt, skal du bare ikke lade noget stå mellem semikolonerne.

Kode:

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)         |
+---------------+----------------+-----------+-------------------+

Interessant nok er minustegnet for den negative værdi intakt i dette tilfælde.

Eksempel 8 – Minustegnet

Som nævnt ignorerer sektionsseparatoren enhver allerede eksisterende formatering forbundet med nummeret. Dette inkluderer ethvert minustegn for negative værdier (selvom det foregående eksempel ser ud til at være en undtagelse fra dette).

Hvis du vil inkludere minustegnet, skal du udtrykkeligt tilføje det til din formatstreng. Eksempel nedenfor.

Kode:

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åpeget, synes det foregående eksempel at være en undtagelse fra dette, så noget at huske på. Her er, hvad der sker, hvis jeg tilføjer et minustegn til formatstrengen for den negative værdi i det forrige eksempel:

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

Resultat:

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

  1. Hvordan bygger man en kolbeapplikation omkring en allerede eksisterende database?

  2. Sammenføjning af flere tabeller returnerer værdien NULL

  3. Fejl:vælg kommando nægtet bruger '<brugerid>'@'<ip-adresse>' for tabellen '<tabelnavn>'

  4. SQL Server Full Text Search Escape Characters?