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

Sådan formateres negative værdier med parenteser i SQL Server (T-SQL)

Her er en hurtig måde at tilføje parenteser omkring negative tal i SQL Server, når du bruger FORMAT() fungere.

Målet her er, at parenteser kun tilføjes til negative værdier. Ingen parenteser tilføjes til positive værdier eller nuller. Også parenteserne erstatter ethvert minustegn, der ellers ville blive vist (med andre ord, der vises intet minustegn, når parenteserne bruges).

Selvom formatering ofte bedst overlades til præsentationslaget, kan der være tilfælde, der dikterer en T-SQL-løsning i SQL Server. I sådanne tilfælde hjælper denne artikel forhåbentlig.

Eksempel 1 – Automatiske parenteser

Som nævnt bruger løsningerne i denne artikel FORMAT() fungere. Denne funktion formaterer en numerisk (eller dato/tid) værdi og returnerer derefter en formateret strengrepræsentation af denne værdi.

Når du kalder denne funktion, sender du værdien, der skal formateres, og en formatstreng, der bestemmer, hvordan den skal formateres. Du kan også give et tredje argument til at definere den lokalitet/kultur, der skal bruges til output.

Der, hvor jeg vil hen med dette, er, at der er nogle tilfælde, hvor FORMAT() vil automatisk omgive negative værdier med parenteser, afhængigt af formatstrengen og den anvendte kultur.

Her er et eksempel på formatering af et tal som en valuta ved hjælp af to forskellige "kultur"-argumenter:

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

Resultat:

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

I dette tilfælde er det en kombination af formatstrengen og kulturen, der bestemmer, om negative værdier er omgivet af parenteser eller ej.

C er en standard numerisk formatangivelse, der formaterer tallet som en valuta. Når denne formatspecifikation bruges, bestemmes det nøjagtige output af kulturen. Dette skyldes, at forskellige kulturer bruger forskellige konventioner til at vise valutabeløb. Kulturen vil bestemme det faktiske valutasymbol, der skal bruges, dets placering, samt hvordan negative værdier vises.

Hvis du ikke angiver en kultur, vil sproget for den aktuelle session blive brugt. Dette er normalt standardsproget for brugeren, men det kan også ændres med SET LANGUAGE erklæring.

Eksempel 2 – Betinget formatering

Hvis en standardformatstreng ikke giver de resultater, du har brug for, skal du bruge en tilpasset numerisk formatstreng i stedet for.

Her er et eksempel på brug af en tilpasset numerisk formatstreng til at omslutte resultatet i parentes:

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

Resultat:

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

For at opnå de resultater, vi ønsker, bruger formatstrengen en sektionsseparator til at give betinget formatering.

Betinget formatering er, hvor du angiver et andet format, afhængigt af en given betingelse. Når du bruger FORMAT() funktion, kan du bruge betinget formatering til at anvende forskellig formatering på et tal, afhængigt af om det tal er positivt, negativt eller nul.

I denne sammenhæng er betinget formatering muliggjort af semikolon (; ). Dette omtales som "sektionsadskilleren". I dette tilfælde brugte jeg kun et semikolon, fordi jeg kun vil have to sektioner (for at skelne mellem negative og ikke-negative).

Når kun to afsnit er inkluderet, gælder det første afsnit for både positive værdier og nuller. Det andet afsnit gælder for negative værdier. Du kan også tilføje endnu et semikolon for at angive et andet format kun for nuller (mere om det nedenfor).

Eksempel 3 – Sammenlignet med positiv og nul

Her er et andet eksempel, denne gang inkluderer jeg en positiv værdi og nul (bare for at demonstrere pointen mere tydeligt).

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

Resultat:

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

Eksempel 4 – Alternativ formatering

Du er ikke begrænset til kun parenteser. Du kan f.eks. bruge krøllede seler eller firkantede parenteser eller næsten alt, hvad du kan lide.

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

Resultat:

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

Eksempel 5 – Tre betingelser

Som nævnt kan du også tilføje en tredje betingelse for at give separat formatering for nuller. Her er et hurtigt eksempel:

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

Resultat:

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

Eksempel 6 – Hvor er minustegnet?

Du har måske bemærket, at minustegnet ikke engang er vist på de negative værdier. Dette skyldes, at sektionsseparatoren ignorerer enhver allerede eksisterende formatering på en værdi (inklusive eventuelle minustegn). Dette betyder, at hvis du bruger betinget formatering, og du faktisk vil have minustegnet på negative værdier, skal du tilføje det i din formatstreng:

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

Resultat:

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

Der er dog nogle tilfælde, hvor minustegnet forbliver intakt (i hvert fald på mit system):

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

Resultat:

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

I dette eksempel deler negative og positive værdier det samme afsnit. Dette skyldes, at jeg tilføjede en sektionsseparator for negative værdier, men efterlod den tom. I dette tilfælde gælder formatstrengen i den første sektion for både positive og negative værdier.

Som nævnt forbliver minustegnet i dette tilfælde intakt for negative værdier.


  1. Kræver ODP.NET installation af Oracle Client

  2. Sådan fungerer STR()-funktionen i SQL Server (T-SQL)

  3. Sådan opdeles en streng i Oracle

  4. Flerkolonneindeks på 3 felter med heterogene datatyper