2009-09-15 51 views
19

Tôi có bảng trong cơ sở dữ liệu có cột số điện thoại. Các số liệu này trông như thế này:Cách định dạng cột số làm số điện thoại trong SQL

123456789 

Tôi muốn định dạng đó trông như thế này:

123-456-789 
+0

Bạn có muốn để định dạng chúng trong SQL hoặc mã của bạn client hiển thị (ASP, WinForms, XML, vv)? – Kane

+0

đến sql - nói cách khác để cập nhật định dạng mới – avnic

Trả lời

32

này nên làm điều đó:

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

Incorporated Kane, bạn có thể tính toán định dạng số điện thoại khi chạy. Một cách tiếp cận có thể sẽ được sử dụng các chức năng vô hướng cho mục đích này (các công trình trong 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

Ngoài ra nếu bạn muốn giữ giá trị ban đầu cộng với định dạng mới, bạn có thể thêm cột được tính toán (sử dụng một cái gì đó tương tự như câu trả lời @ David ở trên) – Kane

+0

@Kane: Cảm ơn, Tôi đã mượn ý tưởng này và chỉnh sửa bài đăng. –

+2

Đó phải là một 'RETURNS varchar (12)' và 'SUBSTRING' cuối cùng cần phải là' SUBSTRING (@phoneNumber, 7, 4) ' –

15

tôi thường muốn khuyên bạn nên rời khỏi định dạng lên đến mã front-end của bạn và chỉ trả lại dữ liệu như-là từ SQL. Tuy nhiên, để làm điều đó trong SQL, tôi khuyên bạn nên tạo một hàm do người dùng định nghĩa để định dạng nó. Một cái gì đó như thế này:

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 

nào thì bạn có thể sử dụng như thế này:

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

Nó có một bảo vệ tại, trong trường hợp số điện thoại được lưu trữ không phải là số lượng dự kiến ​​của các chữ số dài, là trống , null vv - nó sẽ không lỗi.

CHỈNH SỬA: Chỉ cần hẹn giờ bạn muốn cập nhật dữ liệu hiện có của mình. Các bit chính có liên quan từ câu trả lời của tôi sau đó là bạn cần phải bảo vệ chống lại "dodgy"/dữ liệu không đầy đủ (tức là nếu một số giá trị hiện có chỉ có 5 ký tự dài)

+0

điểm tốt về dữ liệu tinh vi! – HLGEM

+1

bạn có thể muốn xem xét việc cập nhật mẫu mã để kiểm tra trước để xem độ dài <> 10 ký tự vì đó có phải là số hợp lệ nhỏ nhất trong ngữ cảnh này hay không. Với một tiền tố nó sẽ là 11 ký tự. Cùng đi cho tuyên bố khác. Bạn muốn đưa vào các nhóm như 3 chữ số + 3 chữ số + 4 chữ số – IEnumerator

8

Tôi không khuyên bạn nên giữ dữ liệu xấu trong cơ sở dữ liệu và sau đó chỉ sửa nó trên đầu ra. Chúng tôi có một cơ sở dữ liệu ở đâu số điện thoại được nhập vào khác nhau như:

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

Những người khác trong tổ chức có thể viết nhiều chức năng truy xuất và cập nhật cơ sở dữ liệu và do đó sẽ khó đặt định dạng và r quy tắc etrieval. Do đó, tôi chỉnh sửa dữ liệu trong cơ sở dữ liệu trước hết và sau đó thiết lập các quy tắc và xác nhận hợp lệ biểu mẫu để bảo vệ tính toàn vẹn của cơ sở dữ liệu này trong tương lai.

Tôi không thấy lý do nào để lưu dữ liệu xấu trừ khi được đề xuất cột trùng lặp được thêm vào với định dạng đã sửa và dữ liệu ban đầu được lưu trữ để dự phòng và tham chiếu.

+0

Tôi không thực sự chắc chắn liệu tôi sẽ xem xét ví dụ về số điện thoại từ câu hỏi có định dạng không đúng. –

+0

Đôi khi, đặc biệt là trong các tổ chức lớn, nguồn dữ liệu nằm ngoài tầm kiểm soát/phạm vi tiếp cận của bạn và chỉ có thể được sửa chữa trên đầu ra. – IKnowledge

8

Khi người dùng trên đã đề cập, những giải pháp rất cơ bản và họ sẽ không hoạt động nếu cơ sở dữ liệu có định dạng điện thoại khác nhau như: (123)123-4564 123-456-4564 vv

đây là một giải pháp phức tạp hơn sẽ hoạt động với bất kỳ đầu vào nào được cung cấp:

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

Tôi thấy rằng điều này hoạt động nếu muốn ở định dạng (123) - 456-7890.

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

chức năng cập nhật @ sqiller cho mục đích của tôi

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

Giải pháp sử dụng SUBSTRING và nối + gần độc lập của RDBMS. Dưới đây là một giải pháp ngắn mà là cụ thể cho SQL Server:

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

Bạn cũng có thể thử điều này:

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 

cuối

sử dụng vào nó chọn

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

Output sẽ là

enter image description here

0

Nếu bạn muốn định dạng đầu ra, không cần phải tạo bảng mới hoặc hàm mới. Trong trường hợp này, mã vùng nằm trên một trường riêng biệt.Tôi sử dụng field1, field2 chỉ để minh họa bạn có thể chọn các lĩnh vực khác trong cùng một truy vấn:

area phone 
213 8962102 

Chọn tuyên bố:

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 

mẫu OUTPUT:

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

Bạn có thể sử dụng FORMAT nếu cột của bạn là một số Cú pháp như FORMAT (giá trị, định dạng [, văn hóa]) Đang sử dụng như FORMAT (@d, 'D', 'en-US') hoặc FORMAT(123456789,'###-##-####') (Nhưng này hoạt động chỉ SQL SERVER 2012 Và Sau)

Trong Sử dụng Giống như UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT(COLUMN_NAME ,'###-##-####')

nếu cột của bạn là varchar hoặc nvarchar sử dụng làm như thế này CONCAT(SUBSTRING(CELLPHONE,0,4),' ',SUBSTRING(CELLPHONE,4,3),'',SUBSTRING(CELLPHONE,7,2) ,' ',SUBSTRING(CELLPHONE,9,2))

Bạn luôn có thể nhận giúp từ

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

Các vấn đề liên quan