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
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
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
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
@Kane: Cảm ơn, Tôi đã mượn ý tưởng này và chỉnh sửa bài đăng. –
Đó phải là một 'RETURNS varchar (12)' và 'SUBSTRING' cuối cùng cần phải là' SUBSTRING (@phoneNumber, 7, 4) ' –
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)
điểm tốt về dữ liệu tinh vi! – HLGEM
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
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ư:
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.
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. –
Đô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
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
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)
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
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, '-')
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à
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
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 ,'###-##-####')
Và
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ừ
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
đến sql - nói cách khác để cập nhật định dạng mới – avnic