2016-06-10 6 views
1

Ich habe eine TabelleA, in der PhoneNumber Spalte Werte wie 911234567891 haben. Ich möchte die ersten zwei Ziffern aus dem Start dh 1234567891 entfernen und dann möchte ich es in Telefonnummer Format ändern xxx-xxx-xxxx, so wird das Endergebnis 123-456-7891 sein. Ich habe es schon mit seprate auswählen und aktualisiert Abfrage wie folgt durchgeführt:Entfernen Sie die erste zwei Ziffern und ändern Phonenummer Format 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%' 

Ist es möglich, sie mit einzelner Auswahlabfrage nur zu tun, so dass es keine Notwendigkeit, die Daten zuerst zu aktualisieren? Jede Art von Hilfe oder Vorschlag wird geschätzt.

+0

Vielleicht möchten Sie eine andere Tabelle mit der formatierten Telefonnummer zu aktualisieren, um die Länge des Wertes zu überprüfen, statt von 91%. Was passiert, wenn die Länge nur 10 Zeichen beträgt und die Ortsvorwahl etwa 913 entspricht? –

+0

Wenn dies nie für eine andere Region verwendet wird, ist es in Ordnung. Obwohl * die * Daten in der Tabelle tatsächlich geändert werden, ist die mögliche zukünftige Addition von asiatischen, europäischen, südamerikanischen usw. Telefonnummern sehr herausfordernd. – wallyk

Antwort

0

Ist das wonach Sie suchen?

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

Oder alternativ

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

Oder in SQL Server können Sie eine berechnete Spalte hinzu:

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

sieht aus wie das erste Argument zu 'FORMAT' kann nicht ein' varchar' pro der [Dokumentation] sein (https://msdn.microsoft.com/en-us/library/hh213505.aspx) –

+0

@vkp. . . Natürlich hast du recht. Ich habe die Antwort behoben. –

1

Eine Möglichkeit, es SUBSTRING wenn die Länge der Verwendung zu tun Spalte ist immer fixiert.

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%' 

Mit FORMAT, wenn die Spalte [Phone Numbers] eine numerische Kategorie Datentyp ist.

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

Wenn Sie nur ein select benötigen,

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: Um

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

Sie sind ziemlich nahe, was ich hier wirklich machen möchte. Eigentlich möchte ich meine TabelleB von TabelleA auf der Grundlage der Telefonnummern aktualisieren, die zurückgegeben werden, nachdem sie zu '### - ### - ####' formatiert sind. –

+0

siehe bearbeiten ... –

+0

yup das ist, was ich brauchte. Danke! –