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

So wenden Sie die bedingte Formatierung auf eine Zahl in SQL Server mit FORMAT() an

Vielleicht eines der weniger bekannten Features von FORMAT() Funktion in SQL Server ist eine Funktion, mit der Sie eine bedingte Formatierung auf eine Zahl anwenden können.

Es ist eher eine .NET-Funktion als eine SQL Server (oder T-SQL)-Funktion, aber SQL Server/T-SQL unterstützt sie trotzdem, sodass Sie die Möglichkeit, bedingte Formatierung auf Zahlen anzuwenden, voll ausschöpfen können.

Es läuft alles auf die Formatzeichenfolge hinaus, die Sie an FORMAT() übergeben Funktion.

Sie können eine Formatzeichenfolge übergeben, die angibt, wie die Zahl formatiert werden soll, je nachdem, ob sie positiv, negativ oder null ist.

Nur um das klarzustellen, ich spreche nicht über das Formatieren der Zahl mit Farben oder Schriftarten usw. Ich spreche nur über die Zahlenformatierung, die Sie normalerweise mit FORMAT() verwenden würden Funktion für (z. B. Hinzufügen von Tausendertrennzeichen, Prozentzeichen, Dezimalpunkten usw.).

Außerdem ist diese bedingte Formatierung ziemlich begrenzt – es können nur drei Bedingungen getestet werden (positiv, negativ oder null). Sie können jedoch bei Bedarf dieselbe Formatierung auch auf zwei Bedingungen gleichzeitig anwenden.

Hier erfahren Sie in jedem Fall, wie Sie FORMAT() verwenden Funktion zum Anwenden einer bedingten Formatierung auf eine Zahl in SQL Server.

Einführung von ; – Das Abschnittstrennzeichen

.NET definiert das Semikolon (; ) als einen seiner benutzerdefinierten numerischen Formatbezeichner, der als Abschnittstrenner bezeichnet wird .

Das Abschnittstrennzeichen ist ein bedingter Formatbezeichner, der Abschnitte mit separaten Formatzeichenfolgen für positive, negative und Nullzahlen definiert. Auf diese Weise können Sie eine Zahl unterschiedlich formatieren, je nachdem, ob ihr Wert positiv, negativ oder null ist.

Eine benutzerdefinierte numerische Formatzeichenfolge kann bis zu drei Abschnitte enthalten, die durch Semikolons getrennt sind. Diese lauten wie folgt:

  • Ein Abschnitt :In diesem Fall gilt keine bedingte Formatierung. Der Formatstring gilt für alle Werte. Es wird kein Abschnittstrenner benötigt (weil es nur einen Abschnitt gibt). Zweifellos ist dies die häufigste Form von Formatzeichenfolgen.
  • Zwei Abschnitte :Der erste Abschnitt gilt für positive Werte und Nullen, der zweite Abschnitt gilt für negative Werte.

    Wenn die zu formatierende Zahl negativ ist, aber nach dem Runden gemäß dem Format im zweiten Abschnitt Null wird, wird die resultierende Null gemäß dem ersten Abschnitt formatiert.

  • Drei Abschnitte :Der erste Abschnitt gilt für positive Werte, der zweite Abschnitt gilt für negative Werte und der dritte Abschnitt gilt für Nullen.

    Der zweite Abschnitt kann leer gelassen werden (indem nichts zwischen den Semikolons steht), in diesem Fall gilt der erste Abschnitt für alle Werte ungleich Null.

    Wenn die zu formatierende Zahl nicht Null ist, aber nach dem Runden gemäß dem Format im ersten oder zweiten Abschnitt Null wird, wird die resultierende Null gemäß dem dritten Abschnitt formatiert.

Beachten Sie, dass negative Werte immer ohne Minuszeichen angezeigt werden, wenn Abschnittstrennzeichen verwendet werden (obwohl es Ausnahmen gibt, wie Sie später sehen werden). Wenn Sie möchten, dass der formatierte Endwert ein Minuszeichen hat, müssen Sie das Minuszeichen ausdrücklich als Teil der benutzerdefinierten Formatzeichenfolge einschließen. Dies gilt auch für alle anderen bereits vorhandenen Formatierungen, die einer Nummer zugeordnet sind.

Beispiel 1 – Ein Abschnitt (keine bedingte Formatierung)

Hier ist eine typische numerische Formatzeichenfolge, die aus einem Abschnitt besteht. Es werden keine Abschnittstrennzeichen verwendet, und daher gilt keine bedingte Formatierung .

Code:

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

Ergebnis:

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

Beachten Sie, dass das Minuszeichen intakt bleibt. Dies wäre entfernt worden, wenn wir Abschnittstrennzeichen verwendet hätten.

Beispiel 2 – Zwei Abschnitte (bedingte Formatierung)

Hier beginnt die bedingte Formatierung.

In diesem Beispiel haben wir zwei Abschnitte (getrennt durch ein Abschnittstrennzeichen). Der Abschnitt links vom Trennzeichen gilt nur für Werte, die entweder positiv oder Null sind. Der Abschnitt rechts gilt nur für negative Werte.

Code:

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

Ergebnis:

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

In diesem Fall war die Zahl positiv, also wurde der erste Abschnitt verwendet, um sie zu formatieren.

Beispiel 3 – Zwei Abschnitte (gleicher Formatstring, unterschiedliche Werte)

Im nächsten Beispiel wird dieselbe Formatzeichenfolge auf verschiedene Werte angewendet (positiv, negativ und null).

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;

Ergebnis:

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

Dieses Beispiel demonstriert also den wahren Vorteil von Abschnittstrennzeichen – dass wir je nach Wert unterschiedliche Ergebnisse erzielen können.

Beispiel 4 – Zwei Abschnitte mit Rundung

Bei Verwendung von zwei Abschnitten werden alle negativen Werte, die auf Null gerundet werden, unter der ersten Formatzeichenfolge formatiert.

Code:

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

Ergebnis:

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

Beispiel 5 – Drei Abschnitte (grundlegende Verwendung)

Hier ist ein einfaches Beispiel für die Angabe von drei Abschnitten. Dazu verwenden wir zwei Abschnittstrenner.

Code:

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

Ergebnis:

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

In diesem Fall war die Zahl ein positiver Wert, also wurde sie unter dem ersten Abschnitt formatiert.

Beispiel 6 – Drei Abschnitte (gleicher Formatstring, unterschiedliche Werte)

Dieses Beispiel demonstriert die verschiedenen Ergebnisse, die wir je nach Eingabewert aus dem vorherigen Beispiel erhalten könnten.

Hier wird der gleiche Formatstring auf unterschiedliche Werte angewendet. Den Formatstring weise ich auch einer Variablen zu, aber das dient nur der besseren Lesbarkeit.

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

Ergebnis:

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

Beispiel 7 – Drei Abschnitte (einschließlich eines leeren)

Wenn Sie die zweite Formatzeichenfolge leer lassen, gilt der erste Abschnitt für alle Werte ungleich Null. Um es leer zu lassen, lassen Sie einfach nichts zwischen den Semikolons.

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

Ergebnis:

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

Interessanterweise bleibt in diesem Fall das Minuszeichen für den negativen Wert erhalten.

Beispiel 8 – Das Minuszeichen

Wie bereits erwähnt, ignoriert das Abschnittstrennzeichen alle bereits vorhandenen Formatierungen, die der Nummer zugeordnet sind. Dazu gehören alle Minuszeichen für negative Werte (obwohl das vorherige Beispiel eine Ausnahme zu sein scheint).

Wenn Sie das Minuszeichen einschließen möchten, müssen Sie dies explizit zu Ihrer Formatzeichenfolge hinzufügen. Beispiel unten.

Code:

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

Ergebnis:

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

Wie bereits erwähnt, scheint das vorherige Beispiel eine Ausnahme zu sein, also etwas, das man im Hinterkopf behalten sollte. Folgendes passiert, wenn ich der Formatzeichenfolge für den negativen Wert im vorherigen Beispiel ein Minuszeichen hinzufüge:

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

Ergebnis:

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