2016-06-10 2 views
1

У меня есть таблицаA, в которой столбец PhoneNumber имеет значения, такие как 911234567891. Я хочу удалить первые две цифры с начала, т.е. 1234567891, а затем я хочу изменить его на формат номера телефона xxx-xxx-xxxx, поэтому итоговый результат будет 123-456-7891. Я уже сделал это с помощью seprate Select и Update запрос следующим образом:Удалить первые две цифры и изменить формат phonenumber SQL

SELECT 
    [Phone Numbers] 
    ,FORMAT([Phone Numbers],'###-###-####') AS [Formatted Phone] 
    FROM tbl_sample 


UPDATE tbl_sample 
SET [Phone Numbers] = SUBSTRING([Phone Numbers], 3, 8000) 
WHERE [Phone Numbers] LIKE '91%' 

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

+0

Вы можете вместо того, чтобы проверить длину значения из 91%. Что происходит, когда длина составляет всего 10 символов, а код области - что-то вроде 913? –

+0

Если это никогда не будет использоваться для другого региона, тогда все в порядке. Хотя на самом деле * изменение * данные в таблице делают возможным дальнейшее добавление азиатских, европейских, южноамериканских и т. Д. Телефонов очень сложными. – wallyk

ответ

0

Это вы что искали?

UPDATE tbl_sample 
    SET [Phone Numbers] = FORMAT(SUBSTRING([Phone Numbers], 3, 8000), '###-###-####') 
    WHERE [Phone Numbers] LIKE '91%'; 

Или, в качестве альтернативы,

select (case when [Phone Numbers] LIKE '91%' 
      then FORMAT(CASt(SUBSTRING([Phone Numbers], 3, 8000) as bigint), '###-###-####') 
      else [Phone Numbers] 
     end) 
from tbl_sample; 

Или в SQL Server, вы можете добавить вычисляемый столбец:

alter table tbl_sample 
    add Formatted_Phone_Number as (
     case when [Phone Numbers] LIKE '91%' 
      then FORMAT(CASt(SUBSTRING([Phone Numbers], 3, 8000) as bigint), '###-###-####') 
      else [Phone Numbers] 
     end)); 
+0

выглядит как первый аргумент 'FORMAT' не может быть' varchar' за [документация] (https://msdn.microsoft.com/en-us/library/hh213505.aspx) –

+0

@vkp. , , Конечно ты прав. Я исправил ответ. –

1

Один из способов сделать это с помощью SUBSTRING, если длина из столбец всегда фиксирован.

UPDATE tbl_sample 
SET [Phone Numbers] = SUBSTRING([Phone Numbers], 3, 3) + '-'+ 
         SUBSTRING([Phone Numbers], 6, 3) + '-'+ 
         SUBSTRING([Phone Numbers], 9, 4) 
WHERE [Phone Numbers] LIKE '91%' 

Использование FORMAT, если столбец [Phone Numbers] является числовым типом данных категории.

UPDATE tbl_sample 
SET [Phone Numbers] = FORMAT([Phone Numbers]-910000000000,'###-###-####') 
WHERE [Phone Numbers] LIKE '91%' 

Если вам просто нужно select,

SELECT [Phone Numbers], 
FORMAT([Phone Numbers]-910000000000,'###-###-####') formatted_number 
--if [Phone Numbers] is varchar use 
--FORMAT(cast([Phone Numbers] as numeric)-910000000000,'###-###-####') 
FROM tbl_sample 
WHERE [Phone Numbers] LIKE '91%' 

Edit: Для того, чтобы обновить другую таблицу с отформатированный номер телефона

UPDATE tb 
SET tb.[Phone Numbers] = FORMAT(ta.[Phone Numbers]-910000000000,'###-###-####') 
FROM tableA ta 
JOIN tableB tb on ta.id = tb.id --change the join condition appropriately 
WHERE tb.[Phone Numbers] LIKE '91%' 
+0

Вы совсем рядом, чего я действительно хочу здесь. На самом деле я хочу обновить свой TableB от tableA на основе номеров телефонов, которые возвращаются после их форматирования на '### - ### - ####'. –

+0

см. Редактировать ... –

+0

yup thats то, что мне нужно. Спасибо! –

Смежные вопросы