Ich habe eine Tabelle in der Datenbank mit einer Telefonnummernspalte. Die Zahlen sehen so aus:
123456789
Ich möchte das so formatieren, dass es so aussieht:
123-456-789
Das sollte es tun:
UPDATE TheTable
SET PhoneNumber = SUBSTRING(PhoneNumber, 1, 3) + '-' +
SUBSTRING(PhoneNumber, 4, 3) + '-' +
SUBSTRING(PhoneNumber, 7, 4)
Mit dem Vorschlag von Kane können Sie die Formatierung der Telefonnummer zur Laufzeit berechnen. Ein möglicher Ansatz wäre die Verwendung von Skalarfunktionen für diesen Zweck (funktioniert in 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
Generell würde ich Ihnen empfehlen, die Formatierung Ihrem Front-End-Code zu überlassen und die Daten so, wie sie sind, von SQL zurückzugeben. Um dies in SQL zu tun, würde ich jedoch empfehlen, eine benutzerdefinierte Funktion zum Formatieren zu erstellen. Etwas wie das:
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
Was können Sie dann so verwenden:
SELECT [dbo].[fnFormatPhoneNumber](PhoneNumber) AS PhoneNumber
FROM SomeTable
Es gibt eine Sicherheitsfunktion, falls die gespeicherte Telefonnummer nicht die erwartete Anzahl von Ziffern ist, leer ist, Null usw. - es wird kein Fehler angezeigt.
BEARBEITEN: Sie müssen gerade Ihre aktuellen Daten aktualisieren. Das wichtigste Bit, das aus meiner Antwort relevant ist, ist, dass Sie sich vor "zweifelhaften"/unvollständigen Daten schützen müssen (d. H., Was ist, wenn einige vorhandene Werte nur 5 Zeichen lang sind).
Ich empfehle nicht, fehlerhafte Daten in der Datenbank zu belassen und sie nur in der Ausgabe zu korrigieren. Wir haben eine Datenbank, in der die Telefonnummern unterschiedlich eingegeben werden:
Verschiedene Personen in einer Organisation schreiben möglicherweise verschiedene Abruffunktionen und Aktualisierungen in die Datenbank. Daher ist es schwieriger, Formatierungs- und Abrufregeln festzulegen. Ich korrigiere daher vor allem die Daten in der Datenbank und setze dann Regeln und Formularvalidierungen ein, um die Integrität dieser Datenbank zukünftig zu schützen.
Ich sehe keine Rechtfertigung dafür, schlechte Daten beizubehalten, es sei denn, es wird vorgeschlagen, eine doppelte Spalte mit korrigierter Formatierung hinzuzufügen und die Originaldaten für Redundanz und Referenzzwecke beizubehalten.
Wie bereits erwähnt, sind diese Lösungen sehr einfach und funktionieren nicht, wenn die Datenbank unterschiedliche Telefonformate hat: (123) 123-4564 123-456-4564 1234567989 Etc
Hier ist eine komplexere Lösung, die mit jeder Eingabe funktioniert:
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
Lösungen, die SUBSTRING
und Verkettung +
verwenden, sind nahezu unabhängig von RDBMS. Hier ist eine kurze Lösung, die für SQL Server spezifisch ist:
declare @x int = 123456789
select stuff(stuff(@x, 4, 0, '-'), 8, 0, '-')
Sie können dies auch versuchen:
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
ende
verwenden Sie es auswählen
(SELECT [dbo].[fn_FormatPhone](f.coffphone)) as 'Phone'
Ausgabe wird sein
@ Sqillers Funktion für meine Zwecke aktualisiert
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
Ich fand, dass dies funktioniert, wenn es in einem (123) - 456-7890-Format fehlt.
UPDATE table
SET Phone_number = '(' +
SUBSTRING(Phone_number, 1, 3)
+ ') '
+ '- ' +
SUBSTRING(Phone_number, 4, 3)
+ '-' +
SUBSTRING(Phone_number, 7, 4)
Sie können FORMAT verwenden, wenn Ihre Spalte eine Zahl ist. Syntax wie FORMAT (Wert, Format [ Kultur]) Wird verwendet wie FORMAT ( @d, 'D', 'en-US' )
oder FORMAT(123456789,'###-##-####')
(aber dies funktioniert nur für SQL Server 2012 und danach)
Im Gebrauch wie UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT(COLUMN_NAME ,'###-##-####')
Und
wenn Ihre Kolumne Varchar oder Nvarchar ist, verwenden Sie diese Option CONCAT(SUBSTRING(CELLPHONE,0,4),' ',SUBSTRING(CELLPHONE,4,3),'
',SUBSTRING(CELLPHONE,7,2) ,' ',SUBSTRING(CELLPHONE,9,2) )
Sie können immer Hilfe von bekommen
Wenn Sie nur die Ausgabe formatieren möchten, müssen Sie keine neue Tabelle oder Funktion erstellen. In diesem Szenario befand sich die Vorwahl in separaten Feldern. Ich verwende field1
, field2
, um nur zu veranschaulichen, dass Sie andere Felder in derselben Abfrage auswählen können:
area phone
213 8962102
Aussage auswählen:
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
Beispiel OUTPUT:
columns: FIELD1, FIELD2, AREA, PHONE, FORMATTED PHONE
data: Field1, Field2, 213, 8962102, 213-896-2102