PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Anexar um sinal de mais/menos a um número no PostgreSQL


No PostgreSQL, você pode usar o to_char() para gerar um número em um determinado formato, inclusive com um sinal de mais ou menos para indicar se é um número positivo ou negativo.

Para fazer isso, use um dos S , MI , PL , ou SG em sua string de formato.

Outra opção é usar PR para incluir quaisquer valores negativos entre colchetes angulares.

Padrões de modelo para números assinados


Os padrões de modelo a seguir podem ser usados ​​para aplicar o sinal apropriado ao número.
Padrão Descrição
MI Sinal de menos na posição especificada (se o número <0).
PL Sinal de adição na posição especificada (se número> 0).
SG Sinal de mais ou menos na posição especificada, dependendo se o número é positivo ou negativo.
S Sinal ancorado ao número (usa localidade).
PR Isso inclui quaisquer valores negativos entre colchetes angulares.

Observe que MI , PL , ou SG são extensões do Postgres (não são SQL padrão).

Exemplo usando S


Aqui está um exemplo para demonstrar o S padronizar.
SELECT to_char(1, 'S9');

Resultado:
+1

Nesse caso, o número é positivo e, portanto, usando minha localidade, o sinal de mais é anexado a ele.

Aqui está novamente, mas com três valores; positivo, negativo e zero.
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

Exemplo usando SG


Aqui está o mesmo exemplo com o SG padronizar.
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

Exemplo usando MI


Veja o que acontece se eu trocar SG com 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

Apenas o número negativo recebe o sinal de menos. O número positivo e o zero não recebem nenhum sinal.

Exemplo usando PL


Aqui está a saída no meu sistema quando eu 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

Exemplo usando PR


Aqui está a saída no meu sistema quando eu 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 

Observe que PR deve vir depois 9 .

Aqui está o que acontece se eu tentar colocá-lo 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 vs S


Você deve ter notado que os exemplos usando SG e S parecem produzir o mesmo resultado e, portanto, se perguntam qual é a diferença entre eles.

A diferença é que S está ancorado ao número enquanto SG , MI , PL não são.

S também usa a localidade, portanto, o sinal real usado dependerá de sua localidade.

Aqui está um exemplo que demonstra a diferença de ancoragem.
SELECT 
  to_char(1, 'S999') AS "S",
  to_char(1, 'SG999') AS "SG";

Resultado:
  S   |  SG  
------+------
   +1 | +  1

E aqui está o que acontece à medida que o número cresce.
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