avn*_*nic 24 sql t-sql sql-server sql-server-2005
我在数据库中有一个带有电话号码列的表.数字看起来像这样:
123456789
Run Code Online (Sandbox Code Playgroud)
我想格式化为这样:
123-456-789
Run Code Online (Sandbox Code Playgroud)
Dav*_*res 38
这应该这样做:
UPDATE TheTable
SET PhoneNumber = SUBSTRING(PhoneNumber, 1, 3) + '-' +
SUBSTRING(PhoneNumber, 4, 3) + '-' +
SUBSTRING(PhoneNumber, 7, 4)
Run Code Online (Sandbox Code Playgroud)
根据Kane的建议,您可以在运行时计算电话号码的格式.一种可能的方法是为此目的使用标量函数(在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
Run Code Online (Sandbox Code Playgroud)
Ada*_*Dev 15
我通常建议您将格式保留为前端代码,并按原样从SQL返回数据.但是,要在SQL中执行此操作,我建议您创建一个用户定义的函数来格式化它.像这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
你可以这样使用:
SELECT [dbo].[fnFormatPhoneNumber](PhoneNumber) AS PhoneNumber
FROM SomeTable
Run Code Online (Sandbox Code Playgroud)
它有一个安全保障,如果存储的电话号码不是预期的数字长,是空白,空等等 - 它不会出错.
编辑:刚开始你想要更新你现有的数据.与我的答案相关的主要部分是你需要防止"狡猾"/不完整的数据(即如果某些现有值只有5个字符长的话)
小智 10
正如上面提到的用户所说,这些解决方案非常基础,如果数据库具有不同的电话格式,它们将无法工作,如:(123)123-4564 123-456-4564 1234567989等
这是一个更复杂的解决方案,可以使用任何输入:
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
Run Code Online (Sandbox Code Playgroud)
我不建议在数据库中保留错误的数据,然后只在输出上更正它.我们有一个数据库,其中输入的电话号码不同:
组织中的不同人员可以编写各种检索功能和对数据库的更新,因此设置格式化和检索规则将更加困难.因此,我首先在数据库中更正数据,然后设置规则并形成验证,以保护此数据库的完整性.
我认为没有理由保留不良数据,除非建议使用更正的格式添加重复列并保留原始数据以进行冗余和参考,并且我将格式错误的数据视为BAD数据.
使用SUBSTRING和连接的解决方案+几乎独立于RDBMS.这是一个特定于SQL Server的简短解决方案:
declare @x int = 123456789
select stuff(stuff(@x, 4, 0, '-'), 8, 0, '-')
Run Code Online (Sandbox Code Playgroud)
你也可以试试这个:
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
Run Code Online (Sandbox Code Playgroud)
结尾
使用它选择
(SELECT [dbo].[fn_FormatPhone](f.coffphone)) as 'Phone'
Run Code Online (Sandbox Code Playgroud)
输出将是