2017-05-18 1 views
0

Ich brauche nur die Benutzername aus einer Spalte Halt Liste von E-Mail-Adressen von ;Extrahieren von Benutzername allein aus einer E-Mail-Adresse Liste

[Spaltenname] E-Mail-Adressen

[email protected];[email protected];[email protected] 

Ich mag getrennt extrahieren die Ausgabe als user1;user2;user3

Wie bekomme ich es in SQL-Abfrage?

+1

Welche Art von SQL-Datenbank? – Kapil

+0

SQL Server 2012 –

+0

Ist die Mail-Domäne immer gleich? Ich meine, ist es immer @ gmail.com oder kann es variieren? – Kapil

Antwort

2

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,'') 
0

Sie können einfach diese code..Just Variablennamen mit Spaltennamen ersetzen verwenden ..

Declare @email nvarchar(50)='[email protected]' 
Select Substring(@email,0,CharIndex('@',@email)) 
+0

OP hat erwähnt, dass eine einzelne Spalte Liste der E-Mail-Adressen hält. '[email protected]; [email protected]; [email protected]' – Coder1991

+0

Ihr Code funktioniert nicht, wenn die Spalte Daten wie diesen '[email protected]; [email protected]; [email protected] enthält ; [email protected]; [email protected] ' –

3
DECLARE @TempData TABLE(YourEMail VARCHAR(100)); 
INSERT INTO @TempData VALUES 
    ('[email protected];[email protected];[email protected]'); 

;WITH Expected 
AS (
    SELECT SUBSTRING(YourEMail, 1, CHARINDEX('@', YourEMail) - 1) AS YourEMail 
    FROM (
     SELECT Split.a.value('.', 'VARCHAR(100)') AS YourEMail 
     FROM (
      SELECT 
       CAST('<S>' + REPLACE(YourEMail, ';', '</S><S>') + '</S>' AS XML) AS YourEMail 
      FROM @TempData 
      ) AS A 
     CROSS APPLY YourEMail.nodes('/S') AS Split(a) 
     ) dt 
    ) 
SELECT DISTINCT STUFF((
      SELECT '; ' + YourEMail 
      FROM Expected 
      FOR XML PATH('') 
      ), 1, 1, '') AS EmailDesiredOutPut 

OutPut

EmailDesiredOutPut 
    -------------- 
    user1; user2; user3 

Reurning Email_String AS Funktion

CREATE FUNCTION [dbo].[udf_ExtractName] (
@YourEMailIn nvarchar(MAX) 
) 
Returns varchar(max) 
AS 
Begin 
DECLARE @YourEMailOut varchar(MAX) 

DECLARE @TempData TABLE(YourEMail VARCHAR(100)); 
INSERT INTO @TempData(YourEMail) 

SELECT @YourEMailIn 

;WITH Expected 
AS (
    SELECT SUBSTRING(YourEMail, 1, CHARINDEX('@', YourEMail) - 1) AS YourEMail 
    FROM (
     SELECT Split.a.value('.', 'VARCHAR(100)') AS YourEMail 
     FROM (
      SELECT 
       CAST('<S>' + REPLACE(YourEMail, ';', '</S><S>') + '</S>' AS XML) AS YourEMail 
      FROM @TempData 
      ) AS A 
     CROSS APPLY YourEMail.nodes('/S') AS Split(a) 
     ) dt 
    ) 
    , FinalResult 
    AS (
SELECT DISTINCT STUFF((
      SELECT '; ' + YourEMail 
      FROM Expected 
      FOR XML PATH('') 
      ), 1, 1, '') AS EmailDesiredOutPut 
     ) 
     SELECT @YourEMailOut=EmailDesiredOutPut From FinalResult 

     RETURN @YourEMailOut 

END 
GO 

--call Funktion wie unter

SELECT [dbo].[udf_ExtractName] ('[email protected];[email protected];[email protected]') AS EmailDesiredOutPut 

OutPut

EmailDesiredOutPut 
------------------- 
user1; user2; user3 
+0

Danke, es funktioniert gut, aber ich versuche, dies in eine Funktion zu setzen, und wenn ich die Ausgangsvariable setze, es wirft Fehler ---> Inkorrekte Syntax in der Nähe des Schlüsselwortes' gesetzt ". –

+0

zeigen Sie den Code, den Sie versucht haben –

+0

Sie möchten den obigen Code als Funktion erstellen? –

Verwandte Themen