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

Cómo aplicar formato condicional a un número en SQL Server usando FORMAT()

Quizás una de las características menos conocidas del FORMAT() La función en SQL Server es una que le permite aplicar formato condicional a un número.

Es más una función de .NET que una función de SQL Server (o T-SQL), pero SQL Server/T-SQL la admite de todos modos, lo que le permite aprovechar al máximo la capacidad de aplicar formato condicional a los números.

Todo se reduce a la cadena de formato que pasa al FORMAT() función.

Puede pasar una cadena de formato que especifique cómo debe formatearse el número, dependiendo de si es positivo, negativo o cero.

Para que quede claro, no estoy hablando de formatear el número con colores o fuentes, etc. Solo estoy hablando del formato de número que normalmente usaría el FORMAT() función para (como agregar separadores de miles, signos de porcentaje, puntos decimales, etc.).

Además, este formato condicional es bastante limitado:solo se pueden probar tres condiciones (positiva, negativa o cero). Sin embargo, también puede aplicar el mismo formato a dos condiciones a la vez si es necesario.

En cualquier caso, así es como se usa el FORMAT() función para aplicar formato condicional a un número en SQL Server.

Presentamos ; – El separador de secciones

.NET define el punto y coma (; ) como uno de sus especificadores de formato numérico personalizado, denominado separador de sección .

El separador de sección es un especificador de formato condicional que define secciones con cadenas de formato separadas para números positivos, negativos y cero. Esto le permite aplicar diferentes formatos a un número dependiendo de si su valor es positivo, negativo o cero.

Una cadena de formato numérico personalizado puede contener hasta tres secciones separadas por punto y coma. Estos son los siguientes:

  • Una sección :No se aplica ningún formato condicional en este caso. La cadena de formato se aplica a todos los valores. No se necesita separador de secciones (porque solo hay una sección). Sin duda, esta es la forma más común de cadena de formato.
  • Dos secciones :La primera sección se aplica a valores positivos y ceros, y la segunda sección se aplica a valores negativos.

    Si el número al que se va a dar formato es negativo, pero se convierte en cero después de redondearlo según el formato de la segunda sección, el cero resultante se formatea según la primera sección.

  • Tres secciones :La primera sección se aplica a valores positivos, la segunda sección se aplica a valores negativos y la tercera sección se aplica a ceros.

    La segunda sección se puede dejar vacía (al no tener nada entre los puntos y comas), en cuyo caso la primera sección se aplica a todos los valores distintos de cero.

    Si el número al que se va a dar formato no es cero, pero se convierte en cero después de redondearlo según el formato de la primera o la segunda sección, el cero resultante se formatea según la tercera sección.

Tenga en cuenta que los valores negativos siempre se muestran sin un signo menos cuando se utilizan separadores de sección (aunque hay excepciones, como verá más adelante). Si desea que el valor con formato final tenga un signo menos, deberá incluir explícitamente el signo menos como parte de la cadena de formato personalizado. Esto también se aplica a cualquier otro formato preexistente asociado con un número.

Ejemplo 1:una sección (sin formato condicional)

Aquí hay una cadena típica de formato numérico que consta de una sección. No se utilizan separadores de sección y, por lo tanto, no se aplica ningún formato condicional .

Código:

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

Resultado:

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

Observe que el signo menos permanece intacto. Esto se habría eliminado si hubiéramos usado separadores de sección.

Ejemplo 2:dos secciones (formato condicional)

Aquí es donde comienza el formato condicional.

En este ejemplo, tenemos dos secciones (separadas por un separador de sección). La sección a la izquierda del separador solo se aplica a los valores que son positivos o cero. La sección de la derecha solo se aplica a valores negativos.

Código:

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

Resultado:

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

En este caso, el número era positivo, por lo que se utilizó la primera sección para formatearlo.

Ejemplo 3:dos secciones (mismo formato de cadena, valores diferentes)

En el siguiente ejemplo, se aplica la misma cadena de formato a diferentes valores (positivo, negativo y cero).

Código:

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;

Resultado:

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

Entonces, este ejemplo demuestra el verdadero beneficio de los separadores de sección:que podemos obtener un resultado diferente según el valor.

Ejemplo 4:dos secciones con redondeo

Cuando se usan dos secciones, los valores negativos que se redondean a cero se formatean bajo la primera cadena de formato.

Código:

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

Resultado:

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

Ejemplo 5:tres secciones (uso básico)

Este es un ejemplo básico de cómo especificar tres secciones. Usamos dos separadores de sección para lograr esto.

Código:

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

Resultado:

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

En este caso, el número era un valor positivo, por lo que se le dio formato en la primera sección.

Ejemplo 6:tres secciones (mismo formato de cadena, diferentes valores)

Este ejemplo demuestra los diversos resultados que podríamos obtener del ejemplo anterior, según el valor de entrada.

Aquí, la misma cadena de formato se aplica a diferentes valores. También asigno la cadena de formato a una variable, pero esto es solo para que sea más fácil de leer.

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

Resultado:

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

Ejemplo 7:tres secciones (incluida una vacía)

Si deja la segunda cadena de formato vacía, la primera sección se aplica a todos los valores distintos de cero. Para dejarlo vacío, simplemente no deje nada entre los puntos y comas.

Código:

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

Resultado:

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

Curiosamente, en este caso el signo menos para el valor negativo se deja intacto.

Ejemplo 8:el signo menos

Como se mencionó, el separador de sección ignora cualquier formato preexistente asociado con el número. Esto incluye cualquier signo menos para valores negativos (aunque el ejemplo anterior parece ser una excepción).

Si desea incluir el signo menos, deberá agregarlo explícitamente a su cadena de formato. Ejemplo a continuación.

Código:

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

Resultado:

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

Como se señaló, el ejemplo anterior parece ser una excepción a esto, por lo que es algo a tener en cuenta. Esto es lo que sucede si agrego un signo menos a la cadena de formato para el valor negativo en el ejemplo anterior:

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

Resultado:

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