Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Formatar um número de telefone no SQL Server (T-SQL)


Aqui estão alguns exemplos de formatação de números de telefone no SQL Server.

Isso inclui exemplos de formatação de números no formato E.164 (para números internacionais), prefixando o código do país e o código de área, bem como omitindo o zero à esquerda do código do país quando necessário.

Números de telefone numéricos


Se o número de telefone for armazenado como um valor numérico (o que não deveria ser), você pode usar o FORMAT() função para formatá-lo como número de telefone.

Exemplo:
SELECT FORMAT(0234567890, '000-000-0000');

Resultado:
023-456-7890

O primeiro argumento é o número de telefone e o segundo argumento é a string de formato. Neste exemplo, estou usando uma string de formato personalizado. Você pode ajustar a string de formato para se adequar ao formato de número de telefone desejado:
SELECT FORMAT(0234567890, '(000) 000-0000');

Resultado:
(023) 456-7890

É importante saber o que as strings de formato realmente fazem. Ao usar zeros, você precisa ter certeza de que o número de telefone realmente tem dígitos em todos os lugares onde há um especificador de formato zero (caso contrário, você pode acidentalmente adicionar zeros ao número).

Você também precisará garantir que haja um especificador de formato para corresponder a cada dígito (caso contrário, você excluirá dígitos do número de telefone).

Outra maneira de expressar a string de formato é com o # especificador de formato. No entanto, isso resultará na remoção de zeros à esquerda do número de telefone.

Aqui está um exemplo para ilustrar o que quero dizer:
SELECT 
    FORMAT(0234567890, '000-000-0000') AS "000-000-0000",
    FORMAT(0234567890, '###-###-####') AS "###-###-####";

Resultado:
+----------------+----------------+
| 000-000-0000   | ###-###-####   |
|----------------+----------------|
| 023-456-7890   | 23-456-7890    |
+----------------+----------------+

O FORMAT() A função aceita apenas tipos numéricos e valores de data e hora. Se o número de telefone de entrada não for realmente um tipo numérico, você provavelmente receberá um erro, algo assim:
SELECT FORMAT('0234567890', '000-000-0000');

Resultado:
Msg 8116, Level 16, State 1, Line 1
Argument data type varchar is invalid for argument 1 of format function.

Nesses casos, é bastante fácil converter o valor em um tipo numérico:
SELECT FORMAT(CAST('0234567890' AS int), '000-000-0000');

Resultado:
023-456-7890

Mas os números de telefone não devem ser armazenados como tipos numéricos de qualquer maneira.

Os valores numéricos podem ser arredondados para cima ou para baixo, ter cálculos executados neles, ter zeros insignificantes removidos automaticamente, etc.

Os números de telefone são um valor fixo. Cada dígito é significativo (incluindo zeros à esquerda). Não queremos que zeros à esquerda desapareçam, a menos que exijamos isso explicitamente (para um código de país, por exemplo). E não queremos que nossos números de telefone sejam arredondados para cima ou para baixo inadvertidamente. E é improvável que você precise realizar cálculos em seus números de telefone.

Portanto, faz mais sentido armazenar números de telefone como uma string. Convertê-los em um tipo numérico antes de formatá-los (como no exemplo acima) ainda pode resultar em alterações inesperadas no número.

Se o número de telefone já for uma string, tente o método a seguir.

Números de telefone armazenados como strings


Se o número de telefone for armazenado como uma string, você pode usar o STUFF() função para inserir as strings apropriadas no número de telefone nos locais relevantes.

Exemplos:
SELECT
    STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, '-') AS "Format 1",
    STUFF(STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, ') '), 1, 0, '(') AS "Format 2";

Resultado:
+--------------+----------------+
| Format 1     | Format 2       |
|--------------+----------------|
| 023-456-7890 | (023) 456-7890 |
+--------------+----------------+

O primeiro argumento é a string original (neste caso, o número de telefone) e o quarto argumento é a string a ser inserida. O segundo argumento especifica onde inserir o quarto argumento.

O terceiro argumento especifica quantos caracteres devem ser excluídos da string original (caso você queira substituir determinados caracteres pela nova string). No nosso caso, não queremos excluir nenhum caractere e, portanto, usamos 0 .

Dependendo do formato do número de telefone original, outra maneira de fazer isso é usar o REPLACE() função. Um exemplo de onde isso pode ser útil é quando o número de telefone já está formatado com um separador, mas precisa ser substituído por outro separador:
SELECT REPLACE('023 456 7890', ' ', '-');

Resultado:
023-456-7890

Números Internacionais


E.164 é um padrão internacional que define o formato dos números de telefone internacionais.

Os números E.164 são formatados [+][country code][area code][local phone number] e pode ter no máximo quinze dígitos.

Aqui está um exemplo que usa dois métodos para concatenar o código do país, o código de área e o número de telefone:
SELECT 
    CONCAT('+', '1', '415', '4567890') AS 'CONCAT() Function',
    '+' + '1' + '415' + '4567890' AS 'Concatenation Operator';

Resultado:
+---------------------+--------------------------+
| CONCAT() Function   | Concatenation Operator   |
|---------------------+--------------------------|
| +14154567890        | +14154567890             |
+---------------------+--------------------------+

O primeiro método usa o CONCAT() função, e o segundo usa o operador de concatenação (+ ).

Esse exemplo formata um número baseado nos EUA. Em muitos países, o código de área tem um zero à esquerda que precisa ser descartado ao usar o formato E.164.

Uma maneira de suprimir quaisquer zeros à esquerda é converter o código de área em um valor numérico e vice-versa.

Aqui está um exemplo de como usar essa técnica em um número baseado no Reino Unido:
SELECT CONCAT(
        '+', 
        '44', 
        CAST(CAST('020' AS int) AS varchar(3)), 
        '34567890'
        );

Resultado:
+442034567890

Neste caso, o zero à esquerda foi descartado.

Aqui está o mesmo código executado em relação ao número anterior baseado nos EUA (que não usa um zero à esquerda no código do país):

SELECT CONCAT(
        '+', 
        '1', 
        CAST(CAST('415' AS int) AS varchar(3)), 
        '4567890'
        );

Resultado:
+14154567890

Desta vez, o código do país permaneceu em três dígitos.