Sie sollten wirklich nie mehr als einen Wert in einer Zelle speichern !!!
Diese 1.NF
schon bricht ...
Was sollten Sie tun: Einführung eine 1:n
-related Tabelle separat zu seinem Besitzer jede E-Mail-Adresse mit einem Fremdschlüssel zu speichern.
Mit SQL Server 2016 können Sie STRING_SPLIT()
verwenden, aber mit Ihrer Version müssen Sie eine der vielen Problemumgehungen verwenden. Im folgenden Code verwende ich zuerst den XML-Trick, um die Zeichenfolge an jedem Semikolon zu trennen. Die endgültige SELECT
verbindet LEFT()
UND CHARINDEX
den Rest wegzuschneiden:
Probieren Sie es aus wie dieses
DECLARE @mockup TABLE(YourEMail VARCHAR(100));
INSERT INTO @mockup VALUES
('us&[email protected];[email protected];[email protected]');
SELECT LEFT(eMailAddress.value(N'text()[1]','nvarchar(max)'),CHARINDEX('@',eMailAddress.value(N'text()[1]','nvarchar(max)'))-1)
FROM @mockup AS m
CROSS APPLY(SELECT CAST('<x>' + REPLACE((SELECT REPLACE(m.YourEMail,';','$$SplitThisHere$$') AS [*] FOR XML PATH('')),'$$SplitThisHere$$','</x><x>') + '</x>' AS XML)) AS A(xmlSplit)
CROSS APPLY A.xmlSplit.nodes(N'/x[text()]') AS B(eMailAddress)
Wenn Sie die Benutzernamen neu verkettet wieder (! Darüber nachdenken), dann können Sie die endgültige Abfrage ändern dies:
SELECT STUFF(
(
SELECT ';' + LEFT(eMailAddress.value(N'text()[1]','nvarchar(max)'),CHARINDEX('@',eMailAddress.value(N'text()[1]','nvarchar(max)'))-1)
FROM @mockup AS m
CROSS APPLY(SELECT CAST('<x>' + REPLACE((SELECT REPLACE(m.YourEMail,';','$$SplitThisHere$$') AS [*] FOR XML PATH('')),'$$SplitThisHere$$','</x><x>') + '</x>' AS XML)) AS A(xmlSplit)
CROSS APPLY A.xmlSplit.nodes(N'/x[text()]') AS B(eMailAddress)
FOR XML PATH(''),TYPE
).value('text()[1]','nvarchar(max)'),1,1,'')
Welche Art von SQL-Datenbank? – Kapil
SQL Server 2012 –
Ist die Mail-Domäne immer gleich? Ich meine, ist es immer @ gmail.com oder kann es variieren? – Kapil