删除分隔符之间的某些值-SQL server

删除分隔符之间的某些值-SQL server,sql,sql-server,logic,Sql,Sql Server,Logic,我试图做的是从电子邮件列中删除某些数据 必须从电子邮件中删除包含@w.com、@x.com、@y.com和@z.com的所有电子邮件 我的问题是,在电子邮件列的每一行中都有多封电子邮件,这些电子邮件地址是像这样分开的 john@daddsa.com; johnsemail@aadsss.com; johnmainemail@z.com; johnthrowemail@y.com (使用分号;作为分隔符) 有许多行包含我试图删除的电子邮件地址。电子邮件栏是vch 所有电子邮件地址的长度各不相同

我试图做的是从电子邮件列中删除某些数据

必须从电子邮件中删除包含
@w.com
@x.com
@y.com
@z.com
的所有电子邮件

我的问题是,在电子邮件列的每一行中都有多封电子邮件,这些电子邮件地址是像这样分开的

john@daddsa.com; johnsemail@aadsss.com; johnmainemail@z.com; johnthrowemail@y.com 
(使用分号
作为分隔符)

有许多行包含我试图删除的电子邮件地址。电子邮件栏是
vch

所有电子邮件地址的长度各不相同

我猜这是通过运行某种循环来实现的

先谢谢你

  • 使用分隔符
    将字符串转换为行
  • 从转换的行中删除不需要的电子邮件
  • 删除后,将行转换为以分隔符分隔的单个字符串
  • CREATE TABLE#delemail(email VARCHAR(5000))

    或电子邮件

    john@daddsa.com;johnsemail@aadsss.com

    如果您有这样的表格:
    电子邮件:
    Row1=Email1;电子邮件2;电子邮件3
    Row2=1;电子邮件2;电邮3;电子邮件4

    要从电子邮件列中删除/更新某些电子邮件,可以使用CLR函数或使用PATINDEX语句(在WHILE语句中)

    也许这些链接可以帮助您:

    .
    .
    .

    INSERT INTO #delemail   VALUES     ( 'john@daddsa.com; johnsemail@aadsss.com; johnmainemail@z.com; johnthrowemail@y.com')
    
    DECLARE @email VARCHAR(500)='' 
    
    
    SELECT @email += ';' + emailrow
    FROM   (SELECT Rtrim(Ltrim(Split.a.value('.', 'VARCHAR(100)'))) emailrow
            FROM   (SELECT Cast ('<M>' + Replace(email, ';', '</M><M>') + '</M>' AS XML) AS Data
                    FROM   #delemail) AS A
                   CROSS APPLY Data.nodes ('/M') AS Split(a)) OU
    WHERE  emailrow NOT LIKE '%@w.com%'
           AND emailrow NOT LIKE '@x.com%'
           AND emailrow NOT LIKE '%@y.com%'
           AND emailrow NOT LIKE '%@z.com%'
    
    SELECT RIGHT(@email, Len(@email) - 1) As OrgEmail
    
    CREATE FUNCTION Removefakmail (@email VARCHAR(5000))
    returns VARCHAR(5000)
    AS
      BEGIN
          DECLARE @newemails VARCHAR(5000)=''
    
          SELECT @newemails += emailrow + '; '
          FROM   (SELECT Rtrim(Ltrim(Split.a.value('.', 'VARCHAR(100)'))) emailrow
                  FROM   (SELECT Cast ('<M>' + Replace(@email, ';', '</M><M>') + '</M>' AS XML) AS Data) AS A
                         CROSS APPLY Data.nodes ('/M') AS Split(a)) OU
          WHERE  emailrow NOT LIKE '%@w.com%'
                 AND emailrow NOT LIKE '@x.com%'
                 AND emailrow NOT LIKE '%@y.com%'
                 AND emailrow NOT LIKE '%@z.com%'
    
          SELECT @newemails = LEFT(@newemails, Len(@newemails) - 1)
          RETURN @newemails
      END
    
    SELECT dbo.Removefakmail(email)
    FROM   #delemail