使用带有通配符查找的T-SQL REPLACE替换字段值

时间:2017-11-13 21:51:39

标签: sql sql-server tsql replace

我有架构表:

CREATE TABLE InvestorDetails
(
    [ID] INT PRIMARY KEY,
    [Created] DATETIME,
    [Updated] DATETIME,
    [ToEmail] VARCHAR(MAX)
)

InvestorDetails中的记录如下所示:

1, 2017-01-01, 2017-02-02, ames@gmail.com;mark@gmail.com;tom@gmail.com;mitchel@gmail.com
2, 2017,01-02, 2017-02-02, ben@gmail.com;michael@gmail.com;mark@gmail.com
3, 2017-02-02, 2017,02-03, test@gmail.com;matthew@gmail.com;dan@gmail.com;jay@gmail.com;mark@gmail.com

我想编写一个查询,通过“markTest@gmail.com”在“ToEmail”字段中更新表格中包含“mark@gmail.com”的每条记录。

例如,在上面的记录1中,我希望它看起来像:

1, 2017-01-01, 2017-02-02, ames@gmail.com;markTest@gmail.com;tom@gmail.com;mitchel@gmail.com

我可以使用以下查询在“EmailRecipients”中找到mark@gmail.com的记录:

SELECT I.ID, I.EmailRecipients
FROM InvestorDetails I
WHERE I.EmailRecipients LIKE '%mark@gmail.com%' 

棘手的部分是确保只更改mark@gmail.com,其余的仍然存在。我相信这可以通过TSQL REPLACE来实现,但是我在编写SQL时遇到了麻烦,尤其是使用string_pattern和string_replacement参数。

非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用以下查询

UPDATE InvestorDetails
SET EmailRecipients = 
       REPLACE(';' + EmailRecipients  + ';', ';mark@gmail.com;' , ';markTest@gmail.com;' )
WHERE EmailRecipients LIKE '%;mark@gmail.com;%'

这样做是为了确保包含drmark@gmail.com等标记的邮件不会更新。

如果要删除添加的leadin和尾随分号,可以使用以下查询

您可以使用以下查询

UPDATE InvestorDetails
SET EmailRecipients = 
       SUBSTRING(REPLACE(';' + EmailRecipients  + ';', ';mark@gmail.com;' , ';markTest@gmail.com;'),2, LEN( REPLACE(';' + EmailRecipients  + ';', ';mark@gmail.com;' , ';markTest@gmail.com;' ) - 2 )
WHERE EmailRecipients LIKE '%;mark@gmail.com;%' AND ISNULL(EmailRecipients,'') <> ''

另一个问题由@MartinSmith在评论中提供

UPDATE InvestorDetails 
SET ToEmail = SUBSTRING(replaced, 2, LEN(replaced) -2) 
FROM InvestorDetails
    CROSS APPLY
(SELECT REPLACE(';'+ ToEmail + ';',';mark@gmail.com;' , ';markTest@gmail.com;')) CA(replaced) 
WHERE ToEmail LIKE '%mark@gmail.com%'