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