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

Come applicare la formattazione condizionale a un numero in SQL Server utilizzando FORMAT()

Forse una delle caratteristiche meno conosciute di FORMAT() La funzione in SQL Server consente di applicare la formattazione condizionale a un numero.

È più una funzionalità .NET che una funzionalità di SQL Server (o T-SQL), ma SQL Server/T-SQL lo supporta lo stesso, consentendo di sfruttare appieno la possibilità di applicare la formattazione condizionale ai numeri.

Tutto si riduce alla stringa di formato che passi a FORMAT() funzione.

Puoi passare una stringa di formato che specifica come formattare il numero, a seconda che sia positivo, negativo o zero.

Giusto per essere chiari, non sto parlando di formattare il numero con colori o caratteri, ecc. Sto solo parlando della formattazione del numero che useresti normalmente con FORMAT() funzione per (come l'aggiunta di separatori di migliaia, segni di percentuale, punti decimali, ecc.).

Inoltre, questa formattazione condizionale è piuttosto limitata:è possibile testare solo tre condizioni (positiva, negativa o zero). Tuttavia, puoi anche applicare la stessa formattazione a due condizioni contemporaneamente, se necessario.

In ogni caso, ecco come utilizzare il FORMAT() funzione per applicare la formattazione condizionale a un numero in SQL Server.

Presentazione di ; – Il separatore di sezioni

.NET definisce il punto e virgola (; ) come uno dei suoi identificatori di formato numerico personalizzati, denominato separatore di sezione .

Il separatore di sezione è un identificatore di formato condizionale che definisce le sezioni con stringhe di formato separate per numeri positivi, negativi e zero. Ciò consente di applicare una formattazione diversa a un numero a seconda che il suo valore sia positivo, negativo o zero.

Una stringa di formato numerico personalizzata può contenere fino a tre sezioni separate da punto e virgola. Questi sono i seguenti:

  • Una sezione :in questo caso non si applica alcuna formattazione condizionale. La stringa di formato si applica a tutti i valori. Non è necessario alcun separatore di sezione (perché c'è solo una sezione). Senza dubbio, questa è la forma più comune di format string.
  • Due sezioni :la prima sezione si applica a valori positivi e zeri e la seconda sezione si applica a valori negativi.

    Se il numero da formattare è negativo, ma diventa zero dopo l'arrotondamento secondo il formato della seconda sezione, lo zero risultante viene formattato secondo la prima sezione.

  • Tre sezioni :la prima sezione si applica ai valori positivi, la seconda sezione si applica ai valori negativi e la terza sezione si applica agli zeri.

    La seconda sezione può essere lasciata vuota (non avendo nulla tra i punti e virgola), nel qual caso la prima sezione si applica a tutti i valori diversi da zero.

    Se il numero da formattare è diverso da zero, ma diventa zero dopo l'arrotondamento in base al formato nella prima o nella seconda sezione, lo zero risultante viene formattato in base alla terza sezione.

Nota che i valori negativi vengono sempre visualizzati senza un segno meno quando vengono utilizzati i separatori di sezione (sebbene ci siano delle eccezioni, come vedrai più avanti). Se desideri che il valore formattato finale abbia un segno meno, dovrai includere esplicitamente il segno meno come parte della stringa di formato personalizzata. Questo vale anche per qualsiasi altra formattazione preesistente associata a un numero.

Esempio 1:una sezione (nessuna formattazione condizionale)

Ecco una tipica stringa di formato numerico composta da una sezione. Non vengono utilizzati separatori di sezione e pertanto non si applica alcuna formattazione condizionale .

Codice:

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

Risultato:

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

Si noti che il segno meno rimane intatto. Questo sarebbe stato rimosso se avessimo utilizzato i separatori di sezione.

Esempio 2 – Due sezioni (formattazione condizionale)

Ecco dove inizia la formattazione condizionale.

In questo esempio, abbiamo due sezioni (separate da un separatore di sezione). La sezione a sinistra del separatore si applica solo ai valori positivi o zero. La sezione a destra si applica solo ai valori negativi.

Codice:

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

Risultato:

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

In questo caso il numero era positivo, quindi per formattarlo è stata utilizzata la prima sezione.

Esempio 3:due sezioni (stessa stringa di formato, valori diversi)

Nell'esempio successivo, la stessa stringa di formato viene applicata a valori diversi (positivo, negativo e zero).

Codice:

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;

Risultato:

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

Quindi questo esempio dimostra il vero vantaggio dei separatori di sezione:possiamo ottenere un risultato diverso a seconda del valore.

Esempio 4 – Due sezioni con arrotondamento

Quando si utilizzano due sezioni, tutti i valori negativi arrotondati a zero vengono formattati nella prima stringa di formato.

Codice:

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

Risultato:

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

Esempio 5 – Tre Sezioni (utilizzo di base)

Ecco un esempio di base per specificare tre sezioni. Usiamo due separatori di sezione per raggiungere questo obiettivo.

Codice:

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

Risultato:

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

In questo caso, il numero era un valore positivo, quindi è stato formattato nella prima sezione.

Esempio 6:tre sezioni (stessa stringa di formato, valori diversi)

Questo esempio mostra i vari risultati che potremmo ottenere dall'esempio precedente, a seconda del valore di input.

Qui, la stessa stringa di formato viene applicata a valori diversi. Assegno anche la stringa di formato a una variabile, ma questo è solo per facilitarne la lettura.

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

Risultato:

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

Esempio 7 – Tre Sezioni (inclusa una vuota)

Se lasci vuota la seconda stringa di formato, la prima sezione si applica a tutti i valori diversi da zero. Per lasciarlo vuoto, non lasciare nulla tra i punti e virgola.

Codice:

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

Risultato:

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

È interessante notare che in questo caso il segno meno per il valore negativo viene lasciato intatto.

Esempio 8 – Il segno meno

Come accennato, il separatore di sezione ignora qualsiasi formattazione preesistente associata al numero. Ciò include qualsiasi segno meno per valori negativi (sebbene l'esempio precedente sembri essere un'eccezione).

Se vuoi includere il segno meno, dovrai aggiungerlo esplicitamente alla tua stringa di formato. Esempio sotto.

Codice:

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

Risultato:

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

Come sottolineato, l'esempio precedente sembra essere un'eccezione a questo, quindi qualcosa da tenere a mente. Ecco cosa succede se aggiungo un segno meno alla stringa di formato per il valore negativo nell'esempio precedente:

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

Risultato:

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