Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment formater des valeurs négatives avec des crochets dans SQL Server (T-SQL)

Voici un moyen rapide d'ajouter des crochets autour des nombres négatifs dans SQL Server lors de l'utilisation du FORMAT() une fonction.

Le but ici est que les parenthèses ne soient ajoutées qu'à négatif valeurs. Aucune parenthèse n'est ajoutée aux valeurs positives ou aux zéros. De plus, les crochets remplacent tout signe moins qui serait autrement affiché (en d'autres termes, aucun signe moins n'est affiché lorsque les crochets sont utilisés).

Bien qu'il soit souvent préférable de laisser le formatage à la couche de présentation, il peut y avoir des cas qui dictent une solution T-SQL dans SQL Server. Dans de tels cas, j'espère que cet article vous aidera.

Exemple 1 - Parenthèses automatiques

Comme mentionné, les solutions de cet article utilisent le FORMAT() une fonction. Cette fonction formate une valeur numérique (ou date/heure), puis renvoie une représentation sous forme de chaîne formatée de cette valeur.

Lors de l'appel de cette fonction, vous transmettez la valeur à formater et une chaîne de format qui détermine comment elle sera formatée. Vous pouvez également fournir un troisième argument pour définir les paramètres régionaux/culture à utiliser pour la sortie.

Là où je veux en venir, c'est qu'il y a des cas où FORMAT() entourera automatiquement les valeurs négatives de crochets, selon la chaîne de format et la culture utilisées.

Voici un exemple de formatage d'un nombre en tant que devise à l'aide de deux arguments "culture" différents :

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

Résultat :

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

Dans ce cas, c'est une combinaison de la chaîne de format et de la culture qui détermine si les valeurs négatives sont entourées de parenthèses ou non.

Le C est un spécificateur de format numérique standard, qui formate le nombre en tant que devise. Lorsque ce spécificateur de format est utilisé, la sortie exacte est déterminée par la culture. En effet, différentes cultures utilisent différentes conventions pour afficher les montants en devises. La culture déterminera le symbole monétaire réel à utiliser, son emplacement, ainsi que la manière dont les valeurs négatives sont affichées.

Si vous ne spécifiez pas de culture, la langue de la session en cours sera utilisée. Il s'agit généralement de la langue par défaut pour l'utilisateur, mais elle peut également être modifiée avec le SET LANGUAGE déclaration.

Exemple 2 - Formatage conditionnel

Si une chaîne de format standard ne fournit pas les résultats dont vous avez besoin, vous devrez utiliser une chaîne de format numérique personnalisée à la place.

Voici un exemple d'utilisation d'une chaîne de format numérique personnalisée pour mettre le résultat entre parenthèses :

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

Résultat :

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

Pour obtenir les résultats souhaités, la chaîne de format utilise un séparateur de section pour fournir une mise en forme conditionnelle.

La mise en forme conditionnelle est l'endroit où vous spécifiez un format différent, en fonction d'une condition donnée. Lors de l'utilisation du FORMAT() , vous pouvez utiliser la mise en forme conditionnelle pour appliquer une mise en forme différente à un nombre, selon que ce nombre est positif, négatif ou nul.

Dans ce contexte, la mise en forme conditionnelle est rendue possible par le point-virgule (; ). C'est ce qu'on appelle le "séparateur de section". Dans ce cas, je n'ai utilisé qu'un seul point-virgule, car je ne veux que deux sections (pour distinguer les négatifs des non-négatifs).

Lorsque seulement deux sections sont incluses, la première section s'applique à la fois aux valeurs positives et aux zéros. La deuxième section s'applique aux valeurs négatives. Vous pouvez également ajouter un autre point-virgule pour spécifier un autre format uniquement pour les zéros (plus d'informations ci-dessous).

Exemple 3 - Comparé à Positif et Zéro

Voici un autre exemple, cette fois j'inclus une valeur positive et zéro (juste pour démontrer le point plus clairement).

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

Résultat :

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

Exemple 4 - Formatage alternatif

Vous n'êtes pas limité aux parenthèses. Vous pouvez utiliser des accolades par exemple, ou des crochets, ou presque tout ce que vous voulez.

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

Résultat :

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

Exemple 5 - Trois conditions

Comme mentionné, vous pouvez également ajouter une troisième condition afin de fournir un formatage séparé pour les zéros. Voici un exemple rapide :

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

Résultat :

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

Exemple 6 - Où est le signe moins ?

Vous avez peut-être remarqué que le signe moins n'est même pas apparu sur les valeurs négatives. En effet, le séparateur de section ignore toute mise en forme préexistante sur une valeur (y compris les signes moins). Cela signifie que, si vous utilisez la mise en forme conditionnelle et que vous voulez réellement le signe moins sur les valeurs négatives, vous devrez l'ajouter dans votre chaîne de format :

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

Résultat :

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

Cependant, il y a des cas où le signe moins reste intact (du moins sur mon système) :

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

Résultat :

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

Dans cet exemple, les valeurs négatives et positives partagent la même section. C'est parce que j'ai ajouté un séparateur de section pour les valeurs négatives mais que je l'ai laissé vide. Dans ce cas, la chaîne de format dans la première section s'applique à la fois aux et positifs valeurs négatives.

Comme mentionné, dans ce cas, le signe moins reste intact pour les valeurs négatives.