Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So formatieren Sie negative Werte mit Klammern in SQL Server (T-SQL)

Hier ist eine schnelle Methode, um negative Zahlen in SQL Server in Klammern zu setzen, wenn Sie FORMAT() verwenden Funktion.

Das Ziel hier ist, dass Klammern nur zu negativ hinzugefügt werden Werte. Positiven Werten oder Nullen werden keine Klammern hinzugefügt. Außerdem ersetzen die Klammern alle Minuszeichen, die ansonsten angezeigt würden (mit anderen Worten, es wird kein Minuszeichen angezeigt, wenn die Klammern verwendet werden).

Obwohl die Formatierung oft am besten der Präsentationsschicht überlassen wird, kann es Fälle geben, die eine T-SQL-Lösung in SQL Server vorschreiben. In solchen Fällen hilft dieser Artikel hoffentlich weiter.

Beispiel 1 – Automatische Klammern

Wie bereits erwähnt, verwenden die Lösungen in diesem Artikel das FORMAT() Funktion. Diese Funktion formatiert einen numerischen Wert (oder Datum/Uhrzeit) und gibt dann eine formatierte Zeichenfolgendarstellung dieses Werts zurück.

Wenn Sie diese Funktion aufrufen, übergeben Sie den zu formatierenden Wert und eine Formatzeichenfolge, die bestimmt, wie er formatiert wird. Sie können auch ein drittes Argument angeben, um das Gebietsschema/die Kultur für die Ausgabe zu definieren.

Worauf ich damit hinaus will, ist, dass es einige Fälle gibt, in denen FORMAT() schließt negative Werte automatisch in Klammern ein, abhängig von der verwendeten Formatzeichenfolge und Kultur.

Hier ist ein Beispiel für die Formatierung einer Zahl als Währung mit zwei verschiedenen „Kultur“-Argumenten:

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

Ergebnis:

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

In diesem Fall ist es eine Kombination aus der Formatzeichenfolge und der Kultur, die bestimmt, ob negative Werte von Klammern umgeben sind oder nicht.

Das C ist ein standardmäßiger numerischer Formatbezeichner, der die Zahl als Währung formatiert. Wenn dieser Formatbezeichner verwendet wird, wird die genaue Ausgabe von der Kultur bestimmt. Dies liegt daran, dass verschiedene Kulturen unterschiedliche Konventionen für die Anzeige von Währungsbeträgen verwenden. Die Kultur bestimmt das tatsächlich zu verwendende Währungssymbol, seine Platzierung sowie die Darstellung negativer Werte.

Wenn Sie keine Kultur angeben, wird die Sprache der aktuellen Sitzung verwendet. Dies ist normalerweise die Standardsprache für den Benutzer, kann aber auch mit SET LANGUAGE geändert werden Aussage.

Beispiel 2 – Bedingte Formatierung

Wenn eine Standardformatzeichenfolge nicht die gewünschten Ergebnisse liefert, müssen Sie stattdessen eine benutzerdefinierte numerische Formatzeichenfolge verwenden.

Hier ist ein Beispiel für die Verwendung einer benutzerdefinierten numerischen Formatzeichenfolge, um das Ergebnis in Klammern einzuschließen:

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

Ergebnis:

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

Um die gewünschten Ergebnisse zu erzielen, verwendet die Formatzeichenfolge ein Abschnittstrennzeichen, um eine bedingte Formatierung bereitzustellen.

Bei der bedingten Formatierung geben Sie abhängig von einer bestimmten Bedingung ein anderes Format an. Bei Verwendung des FORMAT() Funktion können Sie die bedingte Formatierung verwenden, um eine Zahl unterschiedlich zu formatieren, je nachdem, ob diese Zahl positiv, negativ oder null ist.

Die bedingte Formatierung wird dabei durch das Semikolon (; ). Dies wird als „Abschnittstrenner“ bezeichnet. In diesem Fall habe ich nur ein Semikolon verwendet, weil ich nur zwei Abschnitte haben möchte (um zwischen negativen und nicht negativen zu unterscheiden).

Wenn nur zwei Abschnitte enthalten sind, gilt der erste Abschnitt sowohl für positive Werte als auch für Nullen. Der zweite Abschnitt gilt für negative Werte. Sie können auch ein weiteres Semikolon hinzufügen, um ein anderes Format nur für Nullen anzugeben (mehr dazu weiter unten).

Beispiel 3 – Vergleich mit Positiv und Null

Hier ist ein weiteres Beispiel, dieses Mal füge ich einen positiven Wert und eine Null ein (nur um den Punkt klarer zu demonstrieren).

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

Ergebnis:

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

Beispiel 4 – Alternative Formatierung

Sie sind nicht nur auf Klammern beschränkt. Sie können zum Beispiel geschweifte Klammern oder eckige Klammern oder fast alles verwenden, was Sie möchten.

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

Ergebnis:

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

Beispiel 5 – Drei Bedingungen

Wie bereits erwähnt, können Sie auch eine dritte Bedingung hinzufügen, um eine separate Formatierung für Nullen bereitzustellen. Hier ist ein kurzes Beispiel:

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

Ergebnis:

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

Beispiel 6 – Wo ist das Minuszeichen?

Sie haben vielleicht bemerkt, dass das Minuszeichen nicht einmal auf den negativen Werten erscheint. Dies liegt daran, dass das Abschnittstrennzeichen alle bereits vorhandenen Formatierungen für einen Wert (einschließlich aller Minuszeichen) ignoriert. Das bedeutet, wenn Sie bedingte Formatierung verwenden und das Minuszeichen bei negativen Werten tatsächlich verwenden möchten, müssen Sie es in Ihre Formatzeichenfolge einfügen:

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

Ergebnis:

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

Es gibt jedoch einige Fälle, in denen das Minuszeichen intakt bleibt (zumindest auf meinem System):

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

Ergebnis:

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

In diesem Beispiel teilen sich negative und positive Werte denselben Abschnitt. Dies liegt daran, dass ich ein Abschnittstrennzeichen für negative Werte hinzugefügt, es aber leer gelassen habe. In diesem Fall gilt der Formatstring im ersten Abschnitt sowohl für positive als auch für negative Werte.

Wie erwähnt bleibt in diesem Fall das Minuszeichen bei negativen Werten erhalten.