sql >> Database >  >> RDS >> Sqlserver

Negatieve waarden opmaken met haakjes in SQL Server (T-SQL)

Hier is een snelle manier om haakjes toe te voegen rond negatieve getallen in SQL Server bij gebruik van de FORMAT() functie.

Het doel hier is dat haakjes alleen worden toegevoegd aan negatief waarden. Er worden geen haakjes toegevoegd aan positieve waarden of nullen. De haakjes vervangen ook elk minteken dat anders zou worden weergegeven (met andere woorden, er wordt geen minteken weergegeven wanneer de haakjes worden gebruikt).

Hoewel opmaak vaak het beste aan de presentatielaag kan worden overgelaten, kunnen er gevallen zijn die een T-SQL-oplossing in SQL Server dicteren. In dergelijke gevallen helpt dit artikel hopelijk.

Voorbeeld 1 – Automatische haakjes

Zoals vermeld, gebruiken de oplossingen in dit artikel de FORMAT() functie. Deze functie maakt een numerieke waarde (of datum/tijd) op en retourneert vervolgens een opgemaakte tekenreeksrepresentatie van die waarde.

Wanneer u deze functie aanroept, geeft u de waarde door die moet worden opgemaakt en een opmaakreeks die bepaalt hoe deze wordt opgemaakt. U kunt ook een derde argument opgeven om de landinstelling/cultuur te definiëren die voor de uitvoer moet worden gebruikt.

Waar ik hiermee naartoe wil, is dat er enkele gevallen zijn waarin FORMAT() zal automatisch negatieve waarden omringen met haakjes, afhankelijk van de opmaakreeks en cultuur die wordt gebruikt.

Hier is een voorbeeld van het opmaken van een getal als valuta met behulp van twee verschillende "cultuur"-argumenten:

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

Resultaat:

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

In dit geval is het een combinatie van de opmaakreeks en de cultuur die bepaalt of negatieve waarden tussen haakjes staan ​​of niet.

De C is een standaard numerieke notatiespecificatie, die het getal opmaakt als een valuta. Wanneer deze formaatspecificatie wordt gebruikt, wordt de exacte output bepaald door de cultuur. Dit komt omdat verschillende culturen verschillende conventies gebruiken voor het weergeven van valutabedragen. De cultuur bepaalt het daadwerkelijke valutasymbool dat moet worden gebruikt, de plaatsing en hoe negatieve waarden worden weergegeven.

Als u geen cultuur opgeeft, wordt de taal van de huidige sessie gebruikt. Dit is meestal de standaardtaal voor de gebruiker, maar deze kan ook worden gewijzigd met de SET LANGUAGE verklaring.

Voorbeeld 2 – Voorwaardelijke opmaak

Als een tekenreeks met standaardopmaak niet de gewenste resultaten oplevert, moet u in plaats daarvan een aangepaste tekenreeks voor numerieke opmaak gebruiken.

Hier is een voorbeeld van het gebruik van een aangepaste tekenreeks voor numerieke notatie om het resultaat tussen haakjes te plaatsen:

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

Resultaat:

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

Om de gewenste resultaten te bereiken, gebruikt de opmaakreeks een sectiescheidingsteken om voorwaardelijke opmaak te bieden.

Voorwaardelijke opmaak is waar u een andere opmaak specificeert, afhankelijk van een bepaalde voorwaarde. Bij gebruik van de FORMAT() functie kunt u voorwaardelijke opmaak gebruiken om verschillende opmaak op een getal toe te passen, afhankelijk van of dat getal positief, negatief of nul is.

In deze context wordt voorwaardelijke opmaak mogelijk gemaakt door de puntkomma (; ). Dit wordt het "sectiescheidingsteken" genoemd. In dit geval heb ik slechts één puntkomma gebruikt, omdat ik slechts twee secties wil (om onderscheid te maken tussen negatieven en niet-negatieven).

Als er slechts twee secties zijn opgenomen, is de eerste sectie van toepassing op zowel positieve waarden als nullen. Het tweede deel is van toepassing op negatieve waarden. Je kunt ook nog een puntkomma toevoegen om een ​​ander formaat te specificeren alleen voor nullen (meer daarover hieronder).

Voorbeeld 3 – Vergeleken met Positief en Nul

Hier is nog een voorbeeld, deze keer voeg ik een positieve waarde en nul toe (om het punt duidelijker aan te tonen).

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

Resultaat:

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

Voorbeeld 4 – Alternatieve opmaak

U bent niet beperkt tot alleen haakjes. U kunt bijvoorbeeld accolades gebruiken, of vierkante haken, of bijna alles wat u maar wilt.

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

Resultaat:

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

Voorbeeld 5 – Drie voorwaarden

Zoals vermeld, kunt u ook een derde voorwaarde toevoegen om afzonderlijke opmaak voor nullen te bieden. Hier is een snel voorbeeld:

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

Resultaat:

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

Voorbeeld 6 – Waar is het minteken?

Het is je misschien opgevallen dat het minteken niet eens op de negatieve waarden is verschenen. Dit komt omdat het sectiescheidingsteken alle bestaande opmaak voor een waarde negeert (inclusief eventuele mintekens). Dit betekent dat, als u voorwaardelijke opmaak gebruikt en u het minteken op negatieve waarden echt wilt, u dit in uw opmaaktekenreeks moet toevoegen:

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

Resultaat:

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

Er zijn echter enkele gevallen waarin het minteken intact blijft (tenminste op mijn systeem):

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

Resultaat:

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

In dit voorbeeld delen negatieve en positieve waarden dezelfde sectie. Dit komt omdat ik een sectiescheidingsteken voor negatieve waarden heb toegevoegd, maar deze leeg heb gelaten. In dit geval is de opmaakreeks in de eerste sectie van toepassing op zowel positieve en negatieve waarden.

Zoals vermeld, blijft in dit geval het minteken intact voor negatieve waarden.


  1. Ontvang de laatste dag van de maand in PostgreSQL

  2. Het linkerdeel van een tekenreeks ophalen in SQL Server (T-SQL)

  3. Selectie verlenen voor een weergave die geen basistabel is wanneer de basistabel zich in een andere database bevindt

  4. Een nummer "unhexen" in MySQL