Как отформатировать числовой столбец как номер телефона в SQL - PullRequest
22 голосов
/ 15 сентября 2009

У меня есть таблица в базе данных со столбцом номера телефона. Числа выглядят так:

123456789

Я хочу отформатировать это так:

123-456-789

Ответы [ 10 ]

35 голосов
/ 15 сентября 2009

Это должно сделать это:

UPDATE TheTable
SET PhoneNumber = SUBSTRING(PhoneNumber, 1, 3) + '-' + 
                  SUBSTRING(PhoneNumber, 4, 3) + '-' + 
                  SUBSTRING(PhoneNumber, 7, 4)

Включенное предложение Кейна, вы можете вычислить форматирование номера телефона во время выполнения. Один из возможных подходов - использовать для этой цели скалярные функции (работает в SQL Server):

CREATE FUNCTION FormatPhoneNumber(@phoneNumber VARCHAR(10))
RETURNS VARCHAR(12)
BEGIN
    RETURN SUBSTRING(@phoneNumber, 1, 3) + '-' + 
           SUBSTRING(@phoneNumber, 4, 3) + '-' + 
           SUBSTRING(@phoneNumber, 7, 4)
END
15 голосов
/ 15 сентября 2009

Как правило, я рекомендую оставить форматирование до кода внешнего интерфейса и просто вернуть данные как есть из SQL. Однако, чтобы сделать это в SQL, я бы порекомендовал вам создать пользовательскую функцию для ее форматирования. Примерно так:

CREATE FUNCTION [dbo].[fnFormatPhoneNumber](@PhoneNo VARCHAR(20))
RETURNS VARCHAR(25)
AS
BEGIN
DECLARE @Formatted VARCHAR(25)

IF (LEN(@PhoneNo) <> 10)
    SET @Formatted = @PhoneNo
ELSE
    SET @Formatted = LEFT(@PhoneNo, 3) + '-' + SUBSTRING(@PhoneNo, 4, 3) + '-' + SUBSTRING(@PhoneNo, 7, 4)

RETURN @Formatted
END
GO

Который вы можете затем использовать следующим образом:

SELECT [dbo].[fnFormatPhoneNumber](PhoneNumber) AS PhoneNumber
FROM SomeTable

У него есть защита, если сохраненный номер телефона не содержит ожидаемое количество цифр, является пустым, пустым и т. Д. - ошибка не будет.

РЕДАКТИРОВАТЬ: Только что сообщили, что хотите обновить существующие данные. Основным моментом, который уместен в моем ответе, является то, что вам нужно защитить от «хитрых» / неполных данных (то есть, что если некоторые существующие значения имеют длину всего 5 символов)

10 голосов
/ 12 июля 2014

Как уже упоминалось выше, эти решения очень просты и не будут работать, если база данных имеет разные форматы телефонов, такие как: (123)123-4564 123-456-4564 1234567989 и т.д.

Вот более сложное решение, которое будет работать с ЛЮБЫМ вводом:

    CREATE FUNCTION [dbo].[ufn_FormatPhone]
    (@PhoneNumber VARCHAR(32))
RETURNS VARCHAR(32)
AS
  BEGIN
    DECLARE  @Phone CHAR(32)

    SET @Phone = @PhoneNumber

    -- cleanse phone number string
    WHILE PATINDEX('%[^0-9]%',@PhoneNumber) > 0
      SET @PhoneNumber = REPLACE(@PhoneNumber,
               SUBSTRING(@PhoneNumber,PATINDEX('%[^0-9]%',@PhoneNumber),1),'')

    -- skip foreign phones
    IF (SUBSTRING(@PhoneNumber,1,1) = '1'
         OR SUBSTRING(@PhoneNumber,1,1) = '+'
         OR SUBSTRING(@PhoneNumber,1,1) = '0')
       AND LEN(@PhoneNumber) > 11
      RETURN @Phone

    -- build US standard phone number
    SET @Phone = @PhoneNumber

    SET @PhoneNumber = '(' + SUBSTRING(@PhoneNumber,1,3) + ') ' +
             SUBSTRING(@PhoneNumber,4,3) + '-' + SUBSTRING(@PhoneNumber,7,4)

    IF LEN(@Phone) - 10 > 1
      SET @PhoneNumber = @PhoneNumber + ' X' + SUBSTRING(@Phone,11,LEN(@Phone) - 10)

    RETURN @PhoneNumber
  END
9 голосов
/ 25 октября 2012

Я не рекомендую хранить неверные данные в базе данных, а затем только исправлять их на выходе. У нас есть база данных, где номера телефонов вводятся по-разному:

  • (555) 555-5555
  • 555.555.5555
  • (555) 555-5555
  • 5555555555

Разные люди в организации могут писать различные функции поиска и обновления базы данных, и поэтому будет сложнее установить правила форматирования и поиска. Поэтому я в первую очередь исправляю данные в базе данных, а затем устанавливаю правила и проверки форм, которые защищают целостность этой базы данных в будущем.

Я не вижу оправдания для хранения неверных данных, за исключением случаев, когда предлагается добавить дублирующий столбец с исправленным форматированием и сохранить исходные данные для избыточности и справки, и ДА. Я считаю плохо отформатированные данные данными BAD.

5 голосов
/ 18 декабря 2015

Решения, использующие SUBSTRING и конкатенацию +, практически не зависят от СУБД. Вот краткое решение, характерное для SQL Server:

declare @x int = 123456789
select stuff(stuff(@x, 4, 0, '-'), 8, 0, '-')
3 голосов
/ 15 марта 2016

Вы также можете попробовать это:

CREATE  function [dbo].[fn_FormatPhone](@Phone varchar(30)) 
returns varchar(30)
As
Begin
declare @FormattedPhone varchar(30)

set     @Phone = replace(@Phone, '.', '-') --alot of entries use periods instead of dashes
set @FormattedPhone =
    Case
      When isNumeric(@Phone) = 1 Then
        case
          when len(@Phone) = 10 then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 4, 3)+ '-' +substring(@Phone, 7, 4)
          when len(@Phone) = 7  then substring(@Phone, 1, 3)+ '-' +substring(@Phone, 4, 4)
          else @Phone
        end
      When @phone like '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' Then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 5, 3)+ '-' +substring(@Phone, 8, 4)
      When @phone like '[0-9][0-9][0-9] [0-9][0-9][0-9] [0-9][0-9][0-9][0-9]' Then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 5, 3)+ '-' +substring(@Phone, 9, 4)
      When @phone like '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' Then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 5, 3)+ '-' +substring(@Phone, 9, 4)
      Else @Phone
    End
return  @FormattedPhone

конец

использовать на нем выберите

(SELECT [dbo].[fn_FormatPhone](f.coffphone)) as 'Phone'

Выход будет

enter image description here

1 голос
/ 11 ноября 2015

Обновлена ​​функция @ sqiller для моих целей

CREATE FUNCTION [toolbox].[FormatPhoneNumber] (
    @PhoneNumber VARCHAR(50),
    @DefaultIfUnknown VARCHAR(50)
)
RETURNS VARCHAR(50)
AS
BEGIN
    -- remove any extension
    IF CHARINDEX('x', @PhoneNumber, 1) > 0
        SET @PhoneNumber = SUBSTRING(@PhoneNumber, 1, CHARINDEX('x', @PhoneNumber, 1) - 1)

    -- cleanse phone number string
    WHILE PATINDEX('%[^0-9]%',@PhoneNumber) > 0
        SET @PhoneNumber = REPLACE(@PhoneNumber,
                SUBSTRING(@PhoneNumber,PATINDEX('%[^0-9]%',@PhoneNumber),1),'')

    -- Remove US international code if exists, i.e. 12345678900
    IF SUBSTRING(@PhoneNumber,1,1) = '1' AND LEN(@PhoneNumber) = 11
        SET @PhoneNumber = SUBSTRING(@PhoneNumber, 2, 10)

    -- any phone numbers without 10 characters are set to default
    IF LEN(@PhoneNumber) <> 10
        RETURN @DefaultIfUnknown

    -- build US standard phone number
    SET @PhoneNumber = '(' + SUBSTRING(@PhoneNumber,1,3) + ') ' +
                SUBSTRING(@PhoneNumber,4,3) + '-' + SUBSTRING(@PhoneNumber,7,4)

    RETURN @PhoneNumber
END
1 голос
/ 10 февраля 2015

Я обнаружил, что это работает, если хотите в формате (123) - 456-7890.

UPDATE table 
SET Phone_number =  '(' +  
                    SUBSTRING(Phone_number, 1, 3) 
                    + ') ' 
                    + '- ' +
                    SUBSTRING(Phone_number, 4, 3) 
                    + '-' +
                    SUBSTRING(Phone_number, 7, 4) 
0 голосов
/ 07 января 2017

Вы можете использовать ФОРМАТ , если у вас столбец с синтаксисом числа FORMAT (значение, формат [, культура]) Используется как FORMAT ( @d, 'D', 'en-US' ) или FORMAT(123456789,'###-##-####') (но это работает только для SQL SERVER 2012 и после )

В использовании Like UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT(COLUMN_NAME ,'###-##-####')

И

если ваша колонка Varchar или Nvarchar, используйте вот так CONCAT(SUBSTRING(CELLPHONE,0,4),' ',SUBSTRING(CELLPHONE,4,3),' ',SUBSTRING(CELLPHONE,7,2) ,' ',SUBSTRING(CELLPHONE,9,2) )

Вы всегда можете получить помощь от

https://msdn.microsoft.com/en-us/library/hh213505.aspx

0 голосов
/ 24 августа 2016

Если вы хотите просто отформатировать вывод, нет необходимости создавать новую таблицу или функцию. В этом сценарии код города был на отдельных полях. Я использую field1, field2 только для иллюстрации, вы можете выбрать другие поля в том же запросе:

area  phone
213   8962102

Выберите выписку:

Select field1, field2,areacode,phone,SUBSTR(tablename.areacode,1,3) + '-' + SUBSTR(tablename.phone,1,3) + '-' + SUBSTR(tablename.areacode,4,4) as Formatted Phone from tablename

Пример ВЫХОДА:

columns: FIELD1, FIELD2, AREA, PHONE, FORMATTED PHONE
data:    Field1, Field2, 213,  8962102,  213-896-2102
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...