Aqui está uma maneira rápida de adicionar colchetes em torno de números negativos no SQL Server ao usar o
FORMAT()
função. O objetivo aqui é que colchetes sejam adicionados apenas a negativos valores. Nenhum colchete é adicionado a valores positivos ou zeros. Além disso, os colchetes substituem qualquer sinal de menos que seria exibido (em outras palavras, nenhum sinal de menos é exibido quando os colchetes são usados).
Embora a formatação seja geralmente deixada para a camada de apresentação, pode haver casos que determinem uma solução T-SQL no SQL Server. Nesses casos, espero que este artigo ajude.
Exemplo 1 – Parênteses Automáticos
Como mencionado, as soluções neste artigo usam o
FORMAT()
função. Essa função formata um valor numérico (ou data/hora) e retorna uma representação de string formatada desse valor. Ao chamar esta função, você passa o valor a ser formatado e uma string de formato que determina como será formatado. Você também pode fornecer um terceiro argumento para definir a localidade/cultura a ser usada para a saída.
Para onde quero chegar com isso, há alguns casos em que
FORMAT()
colocará automaticamente os valores negativos entre colchetes, dependendo da string de formato e da cultura que está sendo usada. Aqui está um exemplo de formatação de um número como moeda usando dois 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 | +---------+---------+
Nesse caso, é uma combinação da string de formato e da cultura que determina se os valores negativos estão entre parênteses ou não.
O
C
é um especificador de formato numérico padrão, que formata o número como uma moeda. Quando esse especificador de formato é usado, a saída exata é determinada pela cultura. Isso ocorre porque culturas diferentes usam convenções diferentes para exibir valores de moeda. A cultura determinará o símbolo de moeda real a ser usado, seu posicionamento e como os valores negativos serão exibidos. Se você não especificar uma cultura, o idioma da sessão atual será usado. Este é geralmente o idioma padrão para o usuário, mas também pode ser alterado com o
SET LANGUAGE
demonstração. Exemplo 2 – Formatação condicional
Se uma string de formato padrão não fornecer os resultados necessários, você precisará usar uma string de formato numérico personalizado.
Aqui está um exemplo de uso de uma string de formato numérico personalizado para colocar o resultado entre parênteses:
SELECT FORMAT(-123, '0; (0)') Result;
Resultado:
+----------+ | Result | |----------| | (123) | +----------+
Para obter os resultados desejados, a string de formato usa um separador de seção para fornecer formatação condicional.
A formatação condicional é onde você especifica um formato diferente, dependendo de uma determinada condição. Ao usar o
FORMAT()
função, você pode usar a formatação condicional para aplicar formatação diferente a um número, dependendo se esse número é positivo, negativo ou zero. Neste contexto, a formatação condicional é possibilitada pelo ponto e vírgula (
;
). Isso é chamado de “separador de seção”. Nesse caso, usei apenas um ponto e vírgula, pois quero apenas duas seções (para distinguir entre negativos e não negativos). Quando apenas duas seções são incluídas, a primeira seção se aplica a valores positivos e zeros. A segunda seção se aplica a valores negativos. Você também pode adicionar outro ponto e vírgula para especificar outro formato apenas para zeros (mais sobre isso abaixo).
Exemplo 3 – Comparado com Positivo e Zero
Aqui está outro exemplo, desta vez eu incluo um valor positivo e zero (só para demonstrar o ponto mais claramente).
SELECT FORMAT(-123, '0; (0)') Negative, FORMAT(123, '0; (0)') Positive, FORMAT(0, '0; (0)') Zero;
Resultado:
+------------+------------+--------+ | Negative | Positive | Zero | |------------+------------+--------| | (123) | 123 | 0 | +------------+------------+--------+
Exemplo 4 – Formatação alternativa
Você não está limitado a apenas parênteses. Você pode usar chaves, por exemplo, ou colchetes, ou quase tudo o que quiser.
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!!! | +--------+--------+-----------------------------+
Exemplo 5 – Três Condições
Conforme mencionado, você também pode adicionar uma terceira condição para fornecer formatação separada para zeros. Aqui está um exemplo 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) | +--------+------+-----------+
Exemplo 6 – Onde está o sinal de menos?
Você deve ter notado que o sinal de menos nem apareceu nos valores negativos. Isso ocorre porque o separador de seção ignora qualquer formatação preexistente em um valor (incluindo quaisquer sinais de menos). Isso significa que, se você estiver usando formatação condicional e realmente quiser o sinal de menos em valores negativos, precisará adicioná-lo em sua string 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) | +----------------------+-------------------+
No entanto, existem alguns casos em que o sinal de menos permanece intacto (pelo menos no meu sistema):
SELECT FORMAT(123, '0;; 0 (Zero)') Positive, FORMAT(-123, '0;; 0 (Zero)') Negative;
Resultado:
+------------+------------+ | Positive | Negative | |------------+------------| | 123 | -123 | +------------+------------+
Neste exemplo, valores negativos e positivos compartilham a mesma seção. Isso ocorre porque adicionei um separador de seção para valores negativos, mas o deixei vazio. Nesse caso, a string de formato na primeira seção se aplica a e positivos valores negativos.
Como mencionado, neste caso, o sinal de menos permanece intacto para valores negativos.