sql >> Database >  >> RDS >> Sqlserver

Voorwaardelijke opmaak toepassen op een getal in SQL Server met FORMAT()

Misschien een van de minder bekende kenmerken van de FORMAT() functie in SQL Server is er een waarmee u voorwaardelijke opmaak op een getal kunt toepassen.

Het is meer een .NET-functie dan een SQL Server- (of T-SQL)-functie, maar SQL Server/T-SQL ondersteunt het allemaal, zodat u ten volle kunt profiteren van de mogelijkheid om voorwaardelijke opmaak op getallen toe te passen.

Het komt allemaal neer op de opmaakreeks die u doorgeeft aan de FORMAT() functie.

U kunt een opmaakreeks doorgeven die aangeeft hoe het getal moet worden opgemaakt, afhankelijk van of het positief, negatief of nul is.

Voor alle duidelijkheid, ik heb het niet over het formatteren van het getal met kleuren of lettertypen enz. Ik heb het alleen over de getalnotatie die je normaal gesproken zou gebruiken met de FORMAT() functie voor (zoals het toevoegen van scheidingstekens voor duizendtallen, procenttekens, decimale punten, enz.).

Deze voorwaardelijke opmaak is ook vrij beperkt - er kunnen slechts drie voorwaarden worden getest (positief, negatief of nul). Indien nodig kunt u dezelfde opmaak echter ook op twee voorwaarden tegelijk toepassen.

In ieder geval, hier is hoe gebruik de FORMAT() functie om voorwaardelijke opmaak toe te passen op een getal in SQL Server.

Introductie van ; – De sectiescheidingsteken

.NET definieert de puntkomma (; ) als een van de aangepaste numerieke indelingsspecificaties, het sectiescheidingsteken genoemd .

Het sectiescheidingsteken is een voorwaardelijke opmaakspecificatie die secties definieert met aparte opmaakreeksen voor positieve, negatieve en nulgetallen. Hierdoor kunt u verschillende opmaak toepassen op een getal, afhankelijk van of de waarde positief, negatief of nul is.

Een aangepaste tekenreeks voor numerieke notatie kan maximaal drie secties bevatten, gescheiden door puntkomma's. Deze zijn als volgt:

  • Eén sectie :In dit geval is geen voorwaardelijke opmaak van toepassing. De opmaakreeks is van toepassing op alle waarden. Er is geen sectiescheidingsteken nodig (omdat er maar één sectie is). Dit is ongetwijfeld de meest voorkomende vorm van opmaakstring.
  • Twee secties :De eerste sectie is van toepassing op positieve waarden en nullen, en de tweede sectie is van toepassing op negatieve waarden.

    Als het op te maken getal negatief is, maar nul wordt na afronding volgens het formaat in de tweede sectie, wordt de resulterende nul opgemaakt volgens de eerste sectie.

  • Drie secties :De eerste sectie is van toepassing op positieve waarden, de tweede sectie is van toepassing op negatieve waarden en de derde sectie is van toepassing op nullen.

    De tweede sectie kan leeg worden gelaten (door niets tussen de puntkomma's te plaatsen), in welk geval de eerste sectie van toepassing is op alle waarden die niet nul zijn.

    Als het op te maken getal niet-nul is, maar nul wordt na afronding volgens het formaat in de eerste of tweede sectie, wordt de resulterende nul opgemaakt volgens de derde sectie.

Merk op dat negatieve waarden altijd zonder minteken worden weergegeven wanneer sectiescheidingstekens worden gebruikt (hoewel er uitzonderingen zijn, zoals u later zult zien). Als u wilt dat de uiteindelijke opgemaakte waarde een minteken heeft, moet u het minteken expliciet opnemen als onderdeel van de tekenreeks voor aangepaste opmaak. Dit geldt ook voor alle andere reeds bestaande opmaak die aan een getal is gekoppeld.

Voorbeeld 1 – Eén sectie (geen voorwaardelijke opmaak)

Hier is een typische tekenreeks voor numeriek formaat die uit één sectie bestaat. Er worden geen sectiescheidingstekens gebruikt, en daarom is geen voorwaardelijke opmaak van toepassing .

Code:

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

Resultaat:

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

Merk op dat het minteken intact blijft. Dit zou zijn verwijderd als we sectiescheidingstekens hadden gebruikt.

Voorbeeld 2 – Twee secties (voorwaardelijke opmaak)

Hier begint de voorwaardelijke opmaak.

In dit voorbeeld hebben we twee secties (gescheiden door één sectiescheidingsteken). Het gedeelte links van het scheidingsteken is alleen van toepassing op waarden die positief of nul zijn. Het gedeelte aan de rechterkant is alleen van toepassing op negatieve waarden.

Code:

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

Resultaat:

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

In dit geval was het getal positief, dus de eerste sectie werd gebruikt om het op te maken.

Voorbeeld 3 – Twee secties (zelfde formaat string, verschillende waarden)

In het volgende voorbeeld wordt dezelfde opmaakreeks toegepast op verschillende waarden (positief, negatief en nul).

Code:

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;

Resultaat:

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

Dit voorbeeld demonstreert dus het echte voordeel van sectiescheidingstekens:dat we een andere uitkomst kunnen krijgen, afhankelijk van de waarde.

Voorbeeld 4 – Twee secties met afronding

Als u twee secties gebruikt, worden eventuele negatieve waarden die op nul zijn afgerond, opgemaakt onder de eerste opmaaktekenreeks.

Code:

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

Resultaat:

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

Voorbeeld 5 – Drie secties (basisgebruik)

Hier is een eenvoudig voorbeeld van het specificeren van drie secties. We gebruiken twee sectiescheidingstekens om dit te bereiken.

Code:

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

Resultaat:

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

In dit geval was het getal een positieve waarde, dus het werd opgemaakt onder de eerste sectie.

Voorbeeld 6 – Drie secties (tekenreeks met hetzelfde formaat, verschillende waarden)

Dit voorbeeld demonstreert de verschillende resultaten die we uit het vorige voorbeeld konden krijgen, afhankelijk van de invoerwaarde.

Hier wordt dezelfde opmaakreeks toegepast op verschillende waarden. Ik wijs ook de format string toe aan een variabele, maar dit is alleen om het leesbaarder te maken.

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

Resultaat:

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

Voorbeeld 7 – Drie secties (inclusief een lege)

Als u de tweede opmaakreeks leeg laat, is de eerste sectie van toepassing op alle niet-nulwaarden. Laat niets tussen de puntkomma's staan ​​om het leeg te laten.

Code:

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

Resultaat:

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

Interessant is dat in dit geval het minteken voor de negatieve waarde intact blijft.

Voorbeeld 8 – Het minteken

Zoals vermeld negeert het sectiescheidingsteken alle reeds bestaande opmaak die aan het nummer is gekoppeld. Dit omvat elk minteken voor negatieve waarden (hoewel het vorige voorbeeld hierop een uitzondering lijkt te zijn).

Als u het minteken wilt opnemen, moet u dat expliciet toevoegen aan uw opmaakreeks. Voorbeeld hieronder.

Code:

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

Resultaat:

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

Zoals aangegeven lijkt het vorige voorbeeld hierop een uitzondering te zijn, dus iets om rekening mee te houden. Dit is wat er gebeurt als ik een minteken toevoeg aan de opmaakreeks voor de negatieve waarde in het vorige voorbeeld:

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

Resultaat:

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

  1. Hoe Postgres bytea-kolom als bestand te downloaden

  2. Resultaten beperken in MySQL, PostgreSQL en SQLite

  3. Wat gebeurt er als u geen transactie vastlegt in een database (bijvoorbeeld SQL Server)?

  4. Een tekenreeks converteren naar kleine letters in SQL