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

Come formattare valori negativi con parentesi in SQL Server (T-SQL)

Ecco un modo rapido per aggiungere parentesi attorno ai numeri negativi in ​​SQL Server quando si utilizza FORMAT() funzione.

L'obiettivo qui è che le parentesi vengano aggiunte solo a negativo valori. Nessuna parentesi viene aggiunta a valori positivi o zeri. Inoltre, le parentesi sostituiscono qualsiasi segno meno che verrebbe altrimenti visualizzato (in altre parole, quando si utilizzano le parentesi non viene visualizzato alcun segno meno).

Sebbene la formattazione sia spesso meglio lasciata al livello di presentazione, potrebbero esserci casi che impongono una soluzione T-SQL in SQL Server. In questi casi, si spera che questo articolo aiuti.

Esempio 1 – Parentesi automatiche

Come accennato, le soluzioni in questo articolo utilizzano FORMAT() funzione. Questa funzione formatta un valore numerico (o data/ora), quindi restituisce una rappresentazione di stringa formattata di quel valore.

Quando si chiama questa funzione, si passa il valore da formattare e una stringa di formato che determina come verrà formattata. Puoi anche fornire un terzo argomento per definire la lingua/le impostazioni cultura da usare per l'output.

Dove sto andando con questo, è che ci sono alcuni casi in cui FORMAT() circonderà automaticamente i valori negativi tra parentesi, a seconda della stringa di formato e delle impostazioni cultura utilizzate.

Ecco un esempio di formattazione di un numero come valuta utilizzando due diversi argomenti di "cultura":

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

Risultato:

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

In questo caso, è una combinazione della stringa di formato e delle impostazioni cultura che determina se i valori negativi sono racchiusi tra parentesi o meno.

Il C è un identificatore di formato numerico standard, che formatta il numero come valuta. Quando viene utilizzato questo identificatore di formato, l'output esatto è determinato dalle impostazioni cultura. Ciò è dovuto al fatto che culture diverse utilizzano convenzioni diverse per la visualizzazione degli importi in valuta. La cultura determinerà il simbolo di valuta effettivo da utilizzare, la sua posizione e il modo in cui vengono visualizzati i valori negativi.

Se non specifichi una lingua, verrà usata la lingua della sessione corrente. Questa è solitamente la lingua predefinita per l'utente, ma può anche essere modificata con il SET LANGUAGE dichiarazione.

Esempio 2 – Formattazione condizionale

Se una stringa di formato standard non fornisce i risultati di cui hai bisogno, dovrai invece utilizzare una stringa di formato numerico personalizzata.

Ecco un esempio di utilizzo di una stringa di formato numerico personalizzata per racchiudere il risultato tra parentesi:

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

Risultato:

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

Per ottenere i risultati desiderati, la stringa di formato utilizza un separatore di sezione per fornire la formattazione condizionale.

La formattazione condizionale consente di specificare un formato diverso, a seconda di una determinata condizione. Quando si utilizza FORMAT() funzione, puoi utilizzare la formattazione condizionale per applicare una formattazione diversa a un numero, a seconda che quel numero sia positivo, negativo o zero.

In questo contesto, la formattazione condizionale è resa possibile dal punto e virgola (; ). Questo è indicato come il "separatore di sezione". In questo caso ho usato solo un punto e virgola, perché voglio solo due sezioni (per distinguere tra negativi e non negativi).

Quando sono incluse solo due sezioni, la prima sezione si applica sia ai valori positivi che agli zeri. La seconda sezione si applica ai valori negativi. Puoi anche aggiungere un altro punto e virgola per specificare un altro formato solo per gli zeri (più su quello sotto).

Esempio 3 – Confronto con Positivo e Zero

Ecco un altro esempio, questa volta includo un valore positivo e zero (solo per dimostrare il punto in modo più chiaro).

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

Risultato:

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

Esempio 4 – Formattazione alternativa

Non sei limitato alle sole parentesi. Ad esempio, potresti usare parentesi graffe, parentesi quadre o quasi tutto ciò che ti piace.

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

Risultato:

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

Esempio 5 – Tre condizioni

Come accennato, puoi anche aggiungere una terza condizione per fornire una formattazione separata per gli zeri. Ecco un rapido esempio:

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

Risultato:

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

Esempio 6 – Dov'è il segno meno?

Potresti aver notato che il segno meno non è nemmeno apparso sui valori negativi. Questo perché il separatore di sezione ignora qualsiasi formattazione preesistente su un valore (incluso qualsiasi segno meno). Ciò significa che, se stai utilizzando la formattazione condizionale e desideri effettivamente il segno meno sui valori negativi, dovrai aggiungerlo nella stringa di formato:

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

Risultato:

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

Tuttavia, ci sono alcuni casi in cui il segno meno rimane intatto (almeno sul mio sistema):

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

Risultato:

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

In questo esempio, i valori negativi e positivi condividono la stessa sezione. Questo perché ho aggiunto un separatore di sezione per i valori negativi ma l'ho lasciato vuoto. In questo caso, la stringa di formato nella prima sezione si applica sia a che a positivo valori negativi.

Come accennato, in questo caso, il segno meno rimane intatto per valori negativi.