2009-09-15 12 views
19

Mam tabelę w bazie danych z kolumną z numerem telefonu. Liczby wyglądają następująco:Jak sformatować kolumnę numeryczną jako numer telefonu w SQL

123456789 

Chcę sformatować, że aby wyglądać następująco:

123-456-789 
+0

Czy chcesz formatować je w SQL lub kodu klienckiego wyświetlacza (ASP, WinForms, XML, itp)? – Kane

+0

do sql - innymi słowy, aby zaktualizować do nowego formatu – avnic

Odpowiedz

32

ten powinien zrobić:

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

Włączono Kane'a, można obliczyć formatowanie numeru telefonu w czasie wykonywania. Jednym z możliwych rozwiązań byłoby użyć funkcji skalarnych na ten cel (działa w 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 
+3

Również jeśli chcesz zachować oryginalną wartość plus nowe formowanie, możesz dodać kolumnę obliczeniową (używając czegoś podobnego do powyższej odpowiedzi @ Dawida) – Kane

+0

@Kane: Dzięki, Pożyczyłem ten pomysł i zredagowałem wpis. –

+2

To powinno być 'WARTOŚCI POWRÓT varchar (12)' i ostatnie 'SUBSTRING' musi być' SUBSTRING (@phoneNumber, 7, 4) ' –

15

bym generalnie zalecamy pozostawić do formatowania kodu front-end i po prostu zwrócić dane jak jest z SQL. Jednak, aby zrobić to w SQL, polecam utworzyć funkcję zdefiniowaną przez użytkownika, aby ją sformatować. Coś takiego:

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 

które można następnie wykorzystać tak:

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

Posiada zabezpieczenie na wypadek, gdyby nie numer telefonu zapisany jest oczekiwana liczba cyfr jest pusty , null itp. - nie spowoduje błędu.

EDYTOWANIE: Właśnie tak zaprogramowane, aby zaktualizować istniejące dane. Głównym bitem, który jest istotny z mojej odpowiedzi, jest to, że musisz chronić przed "podejrzanymi"/niekompletnymi danymi (tzn. Co jeśli niektóre istniejące wartości mają tylko 5 znaków)

+0

dobry punkt na temat podejrzanych danych! – HLGEM

+1

możesz chcieć rozważyć aktualizację próbki kodu, aby najpierw sprawdzić, czy długość <> 10 znaków, ponieważ byłaby to najmniejsza poprawna liczba w tym kontekście. Z prefiksem będzie to 11 znaków. To samo dotyczy instrukcji else. Chcesz wziąć grupy jako 3 cyfry + 3 cyfry + 4 cyfry – IEnumerator

8

Nie polecam przechowywania złych danych w bazie danych i następnie koryguje tylko na wyjściu. Mamy bazę danych, gdzie numery telefonów są wpisane jako różnorodnie:

  • (555) 555-5555
  • 555 + 555 + 5555
  • 555.555.5555
  • (555)555-5555

Różne osoby w organizacji mogą pisać różne funkcje pobierania i aktualizacje bazy danych, a zatem trudniej będzie ustawić formatowanie i r etrieval rules. Dlatego w pierwszej kolejności poprawiam dane w bazie danych, a następnie ustalam zasady i formułuję walidacje, które chronią integralność tej bazy danych w przyszłości.

Nie widzę uzasadnienia dla przechowywania złych danych, chyba że zgodnie z sugestią dodano duplikat kolumny z poprawionym formatowaniem, a oryginalne dane zachowano dla nadmiarowości i odniesienia oraz TAK Uważam, że źle sformatowane dane to Złe dane.

+0

Nie jestem pewien, czy uznałbym przykład numeru telefonu z tego pytania za źle sformatowany. –

+0

Czasami, szczególnie w dużych organizacjach, źródło danych jest poza kontrolą/zasięgiem i może być poprawione tylko na wyjściu. – IKnowledge

8

Jak wyżej wspomniano użytkowników, rozwiązania te są bardzo proste i nie będzie działać, jeśli baza danych ma różne formaty telefonów jak: (123)123-4564 123-456-4564 itp

Tutaj jest to bardziej skomplikowane rozwiązanie, które będzie pracować z dowolnego wejścia danego:

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 
1

Okazało się, że to działa, jeśli chce w (123) - 456-7890 formacie.

UPDATE table 
SET Phone_number = '(' + 
        SUBSTRING(Phone_number, 1, 3) 
        + ') ' 
        + '- ' + 
        SUBSTRING(Phone_number, 4, 3) 
        + '-' + 
        SUBSTRING(Phone_number, 7, 4) 
1

funkcję aktualizowane @ sqiller dla moich celów

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 
5

rozwiązania wykorzystujące SUBSTRING i konkatenacji + są prawie niezależne od RDBMS. Oto krótki rozwiązanie, które jest specyficzne dla SQL Server:

declare @x int = 123456789 
select stuff(stuff(@x, 4, 0, '-'), 8, 0, '-') 
2

Można również spróbować tego:

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 

koniec

użycie na nim wybrać

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

wyjście będzie być

enter image description here

0

Jeśli chcesz tylko sformatować wyjście, nie musisz tworzyć nowej tabeli ani funkcji. W tym scenariuszu numer kierunkowy znajdował się na osobnych polach.Używam field1, field2 tylko zilustrować można wybrać inne pola w tej samej kwerendy:

area phone 
213 8962102 

SELECT:

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 

WYJŚCIE Próbka:

columns: FIELD1, FIELD2, AREA, PHONE, FORMATTED PHONE 
data: Field1, Field2, 213, 8962102, 213-896-2102 
0

You Can Użyj FORMAT jeśli kolumna jest liczbą Składnia jak FORMAT (wartość, format [, kultura]) W użyciu jak FORMAT (@d, 'D', 'en-US') lub FORMAT(123456789,'###-##-####') (ale to działa tylko SQL Server 2012 i po)

W używać jak UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT(COLUMN_NAME ,'###-##-####')

I

jeśli kolumna jest Varchar Albo nvarchar użycie zrobić tak CONCAT(SUBSTRING(CELLPHONE,0,4),' ',SUBSTRING(CELLPHONE,4,3),'',SUBSTRING(CELLPHONE,7,2) ,' ',SUBSTRING(CELLPHONE,9,2))

Zawsze można uzyskać pomoc z

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

Powiązane problemy