Изменить формат телефонного номера

#asp.net #sql-server #vb.net

#asp.net #sql-сервер #vb.net

Вопрос:

У меня есть поле номера телефона в базе данных. В нем уже есть данные.

Я хочу изменить формат своего телефонного номера на «XXX-XXX-XXXX», в текущей базе данных нет формата телефона.

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

Есть ли какой-либо конкретный способ, с помощью которого я могу изменить свои существующие данные. И сделайте так, чтобы все телефонные номера соответствовали этому формату.

Пожалуйста, совет.

Комментарии:

1. Удалите все нечисловые символы из базы данных и примените любое желаемое форматирование 1. в клиентском приложении; 2. в SQL, который выбирает данные из базы данных; или 3. создайте вычисляемый столбец в таблице, который применяет форматирование для вас на лету, и Select этот столбец вместонеформатированное значение столбца

2. Ну, я хочу это сделать. Но как? Любой запрос очень поможет.

3. Сначала вам нужно будет удалить все существующие символы форматирования. Наиболее вероятными символами являются ()- и пробел. Я бы предпочел оставить форматирование интерфейсному приложению и удалить все символы форматирования и логику из базы данных.

Ответ №1:

Создайте функцию для удаления нечисловых данных и форматирования

 CREATE FUNCTION [UDF_STRIP_NONNUMERIC_DATA](@str VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
  BEGIN
      WHILE Patindex('%[^0-9]%', @str) > 0
        BEGIN
            SET @str = Stuff(@str, Patindex('%[^0-9]%', @str), 1, '')
        END

      RETURN @str
  END 
  

Вы можете использовать STUFF функцию для вставки - между phone номерами

 Select left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](Phone),4,0,'-'),8,0,'-'),12)
From yourtable
  

Если вы используете SQL SERVER 2012 функцию use can use FORMAT (спасибо LukStorms, который упомянул ее в комментарии)

 SELECT Format(Cast(dbo.[Udf_strip_nonnumeric_data](Phone) AS BIGINT), '###-###-####')
FROM   yourtable 
  

Для обновления

 Update yourtable 
   SET phone = left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](Phone),4,0,'-'),8,0,'-'),12)
  

ДЕМОНСТРАЦИЯ

 declare @str  varchar(100)= '9225-123-4567'

select left(Stuff(Stuff(dbo.[UDF_STRIP_NONNUMERIC_DATA](@str),4,0,'-'),8,0,'-'),12)
  

Результат : 922-512-3456

Комментарии:

1. Не работает должным образом Старые данные: 9225-123-4567 — С помощью вашего запроса преобразовано в: 92-5-1-3-4567

2. Теперь он не работает с записями, которые содержат правильные данные. Попробуйте использовать «555-555-5555». Он будет преобразован в «555-555-55»

3. Ну, результат не должен быть «922-512-34567». Я хочу преобразовать его в «922-512-3456»

4. Также проверьте наличие «(832) 823-3183», он преобразуется в «(83-2) -8233183». Я хочу преобразовать все телефонные номера в формат «XXX-XXX-XXXX».

5. @PiyushKhatri — Ну, вам нужно добавить всю информацию о тезисах в первую очередь. Какие другие возможные символы, кроме - , ( и ) ?

Ответ №2:

 declare @phone varchar(24)
set @phone = '(334)789-4532'
--set @phone = '314789-4532'
--set @phone = '3457894532'
--set @phone = '534-789-4532'

SELECT
    LEFT(N,3)   '-'   SUBSTRING(N,4,3)   '-'   RIGHT(N,4)
FROM
    (SELECT CAST(CAST((
            SELECT SUBSTRING(@phone, Number, 1)
            FROM master..spt_values
            WHERE Type='p' AND Number <= LEN(@phone) AND
                SUBSTRING(@phone, Number, 1) LIKE '[0-9]' FOR XML Path(''))
        AS xml) AS varchar(MAX)) as N) as N
  

Ответ №3:

Хорошо, чтобы заменить все нечисловые символы, посмотрите на это.

Вот пример сценария (скопированный по этой ссылке), чтобы показать вам, как это работает (вам нужно будет изменить это, чтобы соответствовать вашему имени таблицы и имен столбцов:

 -- Step 1: creates table to use to hold every char in every phone number
if object_id('dbo.tally') is not null drop table dbo.tally   
   select top 10000 --change to fit max length of phone number
     identity(int,1,1) as n
   into dbo.tally
   from master.dbo.syscolumns sc1,
        master.dbo.syscolumns sc2

-- add pk to maximize performance
  alter table dbo.tally
     add constraint pk_tally_n 
        primary key clustered (n) with fillfactor = 100

-- Step 2: Create temporary table holding three bad phone numbers  
 declare @phonetable table 
   (uniqueid int identity(1,1), 
   phone_number varchar(500)) 
   insert into @phonetable (phone_number) 
   select '01234-567-890' union 
   select '012345 6789ext' union 
   select 'n/a' union select '...12345.....';

 -- Step 3: identify, for every character, whether it is a number or not,
           and remove the non-numeric ones
 with cte (uniqueid, phone_number, goodchar, badchar) as
 ( select uniqueid, phone_number, 
        case when substring(phone_number,N,1) not like '%[^0-9]%' 
             then substring(phone_number,N,1) end as goodchar, 
        case when substring(phone_number,N,1) like '%[^0-9]%' 
             then substring(phone_number,N,1) end as badchar
   from @phonetable , Tally  
   where phone_number like '%[^0-9]%' and N <= len(phone_number) )
   select distinct phone_number, 
        isnull( stuff ( 
                  ( SELECT ''   goodchar 
                FROM cte t1 
        where t1.UniqueID = t2.UniqueID 
          FOR XML PATH ( '' ) ) , 1 , 0 , '' ) ,'')  
                        as clean_phone_number from cte t2 
  

чтобы отобразить номера с форматированием, просто извлеките соответствующие фрагменты и повторно объедините их с тире.

 Select case len(phone) 
       When 10  then left(phone, 3)   '-'   
                     substring(phone, 4,3)   '-'   
                     substring(phone, 7,4)`
       When 7 then left(phone, 3)   '-'   
                   substring(phone, 4,4)
       Else '' end
  

Для создания вычисляемого столбца

 Alter table Add Column FormattedPhone as 
  case len(phone) 
       When 10  then left(phone, 3)   '-'   
                     substring(phone, 4,3)   '-'   
                     substring(phone, 7,4)`
       When 7 then left(phone, 3)   '-'   
                   substring(phone, 4,4)
       Else '' end
  

Ответ №4:

Если вы не возражаете против UDF

 Select [dbo].[udf-Str-Format-Phone]('334)789-4532')  
  

ВОЗВРАТ

 334-789-4532
  

UDF

 CREATE FUNCTION [dbo].[udf-Str-Format-Phone] (@S varchar(max))
Returns varchar(25)
AS
Begin
    Declare @Return varchar(25)

    ;with cte0(N) As (Select 1 From (Values(1),(1),(1),(1),(1)) N(N))
        , cteN(N) As (Select Top (Len(@S)) Row_Number() over (Order By (Select NULL)) From cte0 N1, cte0 N2)
        , cteS(S) As (Select Substring(@S,N,1) From cteN Where Substring(@S, N, 1) LIKE '[0-9]' FOR XML Path(''))

    Select @Return = IIf(Len(S)>=10,Stuff(stuff(S,4,0,'-'),8,0,'-'),Stuff(S,4,0,'-')) From cteS
    Return @Return

End
-- Syntax : Select [dbo].[udf-Str-Format-Phone]('(334)789-4532')  -- Returns 334-789-4532
-- Syntax : Select [dbo].[udf-Str-Format-Phone]('Phone:7894532')  -- Returns 789-4532