sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo dar formato a valores negativos con corchetes en SQL Server (T-SQL)

Aquí hay una forma rápida de agregar corchetes alrededor de números negativos en SQL Server cuando se usa FORMAT() función.

El objetivo aquí es que los corchetes solo se agreguen a negativo valores. No se agregan corchetes a valores positivos o ceros. Además, los corchetes reemplazan cualquier signo menos que de otro modo se mostraría (en otras palabras, no se muestra ningún signo menos cuando se usan los corchetes).

Aunque es mejor dejar el formato a la capa de presentación, puede haber casos que dicten una solución T-SQL en SQL Server. En tales casos, esperamos que este artículo ayude.

Ejemplo 1:paréntesis automáticos

Como se mencionó, las soluciones en este artículo usan el FORMAT() función. Esta función da formato a un valor numérico (o fecha/hora), luego devuelve una representación de cadena formateada de ese valor.

Al llamar a esta función, pasa el valor a formatear y una cadena de formato que determina cómo se formateará. También puede proporcionar un tercer argumento para definir la configuración regional/cultural que se usará para la salida.

A donde voy con esto, es que hay algunos casos donde FORMAT() rodeará automáticamente los valores negativos con corchetes, según la cadena de formato y la referencia cultural que se utilicen.

Aquí hay un ejemplo de formatear un número como una moneda usando dos argumentos de "cultura" diferentes:

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

Resultado:

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

En este caso, es una combinación de la cadena de formato y la cultura lo que determina si los valores negativos están entre paréntesis o no.

El C es un especificador de formato numérico estándar, que formatea el número como una moneda. Cuando se usa este especificador de formato, la referencia cultural determina el resultado exacto. Esto se debe a que las distintas culturas utilizan diferentes convenciones para mostrar los importes de las monedas. La cultura determinará el símbolo de moneda real que se utilizará, su ubicación y cómo se muestran los valores negativos.

Si no especifica una cultura, se utilizará el idioma de la sesión actual. Este suele ser el idioma predeterminado para el usuario, pero también se puede cambiar con SET LANGUAGE declaración.

Ejemplo 2:formato condicional

Si una cadena de formato estándar no proporciona los resultados que necesita, deberá usar una cadena de formato numérico personalizado en su lugar.

Este es un ejemplo del uso de una cadena de formato numérico personalizado para encerrar el resultado entre paréntesis:

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

Resultado:

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

Para lograr los resultados que queremos, la cadena de formato usa un separador de sección para proporcionar formato condicional.

El formato condicional es donde especifica un formato diferente, dependiendo de una condición dada. Al usar FORMAT() función, puede usar el formato condicional para aplicar un formato diferente a un número, dependiendo de si ese número es positivo, negativo o cero.

En este contexto, el formato condicional es posible gracias al punto y coma (; ). Esto se conoce como el "separador de sección". En este caso, solo usé un punto y coma, porque solo quiero dos secciones (para distinguir entre negativos y no negativos).

Cuando solo se incluyen dos secciones, la primera sección se aplica tanto a los valores positivos como a los ceros. La segunda sección se aplica a los valores negativos. También puede agregar otro punto y coma para especificar otro formato solo para ceros (más sobre eso a continuación).

Ejemplo 3 – Comparado con Positivo y Cero

Aquí hay otro ejemplo, esta vez incluyo un valor positivo y cero (solo para demostrar el punto más claramente).

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

Resultado:

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

Ejemplo 4:formato alternativo

No estás limitado a solo paréntesis. Podría usar llaves, por ejemplo, o corchetes, o casi cualquier cosa que desee.

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

Resultado:

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

Ejemplo 5:tres condiciones

Como se mencionó, también puede agregar una tercera condición para proporcionar un formato separado para los ceros. He aquí un ejemplo rápido:

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

Resultado:

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

Ejemplo 6:¿Dónde está el signo menos?

Es posible que haya notado que el signo menos ni siquiera apareció en los valores negativos. Esto se debe a que el separador de sección ignora cualquier formato preexistente en un valor (incluidos los signos menos). Esto significa que, si está utilizando el formato condicional y realmente desea el signo menos en los valores negativos, deberá agregarlo en su cadena de formato:

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

Resultado:

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

Sin embargo, hay algunos casos en los que el signo menos permanece intacto (al menos en mi sistema):

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

Resultado:

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

En este ejemplo, los valores negativos y positivos comparten la misma sección. Esto se debe a que agregué un separador de sección para valores negativos pero lo dejé vacío. En este caso, la cadena de formato en la primera sección se aplica tanto a como positivos. valores negativos.

Como se mencionó, en este caso, el signo menos permanece intacto para valores negativos.