sql >> Base de Datos >  >> RDS >> PostgreSQL

Anteponga un signo más/menos a un número en PostgreSQL

En PostgreSQL, puede usar to_char() para generar un número en un formato determinado, incluso con un signo más o menos para indicar si es un número positivo o negativo.

Para hacer esto, use uno de S , MI , PL , o SG en su cadena de formato.

Otra opción es usar PR para encerrar cualquier valor negativo entre paréntesis angulares.

Patrones de plantilla para números con signo

Los siguientes patrones de plantilla se pueden usar para aplicar el signo apropiado al número.

Patrón Descripción
MI Signo menos en la posición especificada (si el número <0).
PL Signo más en la posición especificada (si el número> 0).
SG Signo más o menos en la posición especificada, dependiendo de si el número es positivo o negativo.
S Signo anclado al número (usa la configuración regional).
PR Esto encierra cualquier valor negativo entre paréntesis angulares.

Tenga en cuenta que MI , PL , o SG son extensiones de Postgres (no son SQL estándar).

Ejemplo usando S

Aquí hay un ejemplo para demostrar el S patrón.

SELECT to_char(1, 'S9');

Resultado:

+1

En este caso, el número es positivo y, por lo tanto, usando mi configuración regional, se antepone el signo más.

Aquí está de nuevo, pero con tres valores; un positivo, un negativo y cero.

SELECT 
  to_char(1, 'S9') AS "1",
  to_char(-1, 'S9') AS "-1",
  to_char(0, 'S9') AS "0";

Resultado:

 1  | -1 | 0  
----+----+----
 +1 | -1 | +0

Ejemplo usando SG

Aquí está el mismo ejemplo con el SG patrón.

SELECT 
  to_char(1, 'SG9') AS "1",
  to_char(-1, 'SG9') AS "-1",
  to_char(0, 'SG9') AS "0";

Resultado:

 1  | -1 | 0  
----+----+----
 +1 | -1 | +0

Ejemplo usando MI

Esto es lo que sucede si cambio SG con MI .

SELECT 
  to_char(1, 'MI9') AS "1",
  to_char(-1, 'MI9') AS "-1",
  to_char(0, 'MI9') AS "0";

Resultado:

 1  | -1 | 0  
----+----+----
  1 | -1 |  0

Solo el número negativo recibe el signo menos. El número positivo y el cero no reciben ningún signo.

Ejemplo usando PL

Aquí está el resultado en mi sistema cuando uso PL .

SELECT 
  to_char(1, 'PL9') AS "1",
  to_char(-1, 'PL9') AS "-1",
  to_char(0, 'PL9') AS "0";

Resultado:

  1  | -1  |  0  
-----+-----+-----
 + 1 |  -1 | + 0

Ejemplo usando relaciones públicas

Aquí está el resultado en mi sistema cuando uso PR .

SELECT 
  to_char(1, '9PR') AS "1",
  to_char(-1, '9PR') AS "-1",
  to_char(0, '9PR') AS "0";

Resultado:

  1  | -1  |  0  
-----+-----+-----
  1  | <1> |  0 

Tenga en cuenta que PR debe venir después 9 .

Esto es lo que sucede si trato de ponerlo antes de 9 :

SELECT 
  to_char(1, 'PR9') AS "1",
  to_char(-1, 'PR9') AS "-1",
  to_char(0, 'PR9') AS "0";

Resultado:

ERROR:  "9" must be ahead of "PR"

SG frente a S

Es posible que haya notado que los ejemplos que usan SG y S parecen generar el mismo resultado y, por lo tanto, se preguntan cuál es la diferencia entre ellos.

La diferencia es que S está anclado al número mientras que SG , MI , PL no lo son.

S también usa la configuración regional, por lo que el signo real utilizado dependerá de su configuración regional.

Aquí hay un ejemplo que demuestra la diferencia de anclaje.

SELECT 
  to_char(1, 'S999') AS "S",
  to_char(1, 'SG999') AS "SG";

Resultado:

  S   |  SG  
------+------
   +1 | +  1

Y esto es lo que sucede a medida que el número crece.

SELECT 
  to_char(1, 'S999') AS "S",
  to_char(1, 'SG999') AS "SG",
  to_char(10, 'S999') AS "S",
  to_char(10, 'SG999') AS "SG",
  to_char(100, 'S999') AS "S",
  to_char(100, 'SG999') AS "SG";

Resultado:

  S   |  SG  |  S   |  SG  |  S   |  SG  
------+------+------+------+------+------
   +1 | +  1 |  +10 | + 10 | +100 | +100