comment combiner les valeurs de plusieurs colonnes et supprimer les doublons à l'aide de transact sql


Rumi

J'ai une table dans la base de données de serveur sql ayant quatre colonnes pour les adresses e-mail, c'est-à-dire Email1,Email2,Email3et Email4. J'ai besoin de créer une fonction pour renvoyer des adresses e-mail combinées et supprimer les e-mails en double

(par exemple, Email1 et Email3 peuvent avoir la même adresse [email protected]et je n'ai besoin de l'inclure qu'une seule fois dans la chaîne combinée).

J'ai écrit une fonction comme ci-dessous qui renvoie les valeurs combinées mais je ne sais pas comment nous pouvons supprimer les e-mails en double.

Create FUNCTION [dbo].[CombineAndCommaSeparateEmails] 

(@Email1 VARCHAR(250),@Email2 VARCHAR(250),@Email3 VARCHAR(250),@Email4 VARCHAR(250))

RETURNS VARCHAR(250)

AS BEGIN

DECLARE @combinedEmails VARCHAR(1000)

Set @combinedEmails=   
concat(
Rtrim(Ltrim(Case when @EMAIL1 is not null then @EMAIL1+',' end)),
Rtrim(Ltrim(Case when @EMAIL2 is not null then @EMAIL2+',' end)),
Rtrim(Ltrim(Case when @EMAIL3 is not null then @EMAIL3+',' end)),
Rtrim(Ltrim(@EMAIL4)))


Set @combinedEmails=   case 
when RIGHT(@combinedEmails,1)=',' then substring(@combinedEmails,1,len(@combinedEmails)-1)
else @combinedEmails END    

RETURN @combinedEmails
END

Des idées? Merci

John Cappelletti

Une autre option (si vous souhaitez conserver l'UDF)

Declare @EMail1 varchar(50) = '[email protected]'
Declare @EMail2 varchar(50) = '[email protected]'
Declare @EMail3 varchar(50) = '[email protected]'
Declare @EMail4 varchar(50) = '[email protected]'

Select Stuff((Select Distinct ','+EMails From (values (@EMail1),(@EMail2),(@EMail3),(@EMail4) ) A (EMails) For XML Path('')),1,1,'')

Retour

[email protected],[email protected]

En tant que fonction

Create FUNCTION [dbo].[CombineAndCommaSeparateEmails] (@Email1 VARCHAR(250),@Email2 VARCHAR(250),@Email3 VARCHAR(250),@Email4 VARCHAR(250))

Returns varchar(250)
AS 

BEGIN
    Return (
    Select Stuff((Select Distinct ','+EMails 
                  From  (values (@EMail1)
                               ,(@EMail2)
                               ,(@EMail3)
                               ,(@EMail4) 
                         ) A (EMails) 
                   Where EMails<>''
                   For XML Path('')),1,1,'')
    )
End

Donc

Select [dbo].[CombineAndCommaSeparateEmails]('[email protected]','[email protected]','[email protected]',null)

Retour

[email protected],[email protected]

Articles connexes