我有架构表:
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参数。
非常感谢任何帮助!
谢谢!
答案 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%'