这是我第一次在Stack Overflow上发帖,所以请告知我是否可以做得更好或提供更多信息。
我已经在这个问题上工作了几天。我有一张桌子,上面有员工对公司的评论。其中一些人可能会提到公司中的特定员工。由于人力资源方面的原因,我们希望将任何出现的员工姓名替换为“员工”一词。我们不考虑拼写错误或拼写错误。
我期望的结果的一个例子是:
Input: 'I dislike dijon mustard. My boss Jon sucks.'
Name to search for: 'Jon'
Output: 'I dislike dijon mustard. My boss employee sucks.'
另一个例子:
Input: 'Aggregating data is boring. Greg is the worst person ever.'
Name to search for: 'Greg'
Output: 'Aggregating data is boring. employee is the worst person ever.'
我想在注释中搜索雇员姓名的出现,但如果在两端都没有其他字母或数字,则仅。名称两端出现空格或标点符号的情况应予以替换。
到目前为止,我已经尝试了以下线程中的建议:
How to replace a specific word in a sentence without replacing in substring in SQL Server替换子字符串中的]
这产生了以下内容
update c
set c.Comment = rtrim(ltrim(Replace(replace(' ' + c.Comment + ' ',' ' + en.FirstName + ' ', 'employee'), ' ' + en.FirstName + ' ', 'employee')))
from AnswerComment c
join #EmployeeNames en on en.SurveyId = c.SurveyId
and c.Comment like '%' + en.FirstName + '%'
但是,我得到这样的结果:
Input: 'I hate bob.'
Name to search for: 'Bob'
Output: 'I hate bob.'
Input: 'Jon sucks'
Name to search for: 'Jon'
Output: 'employeesucks'
一个同事看着这个线程Replace whole word using ms sql server "replace"
并且根据它给了我以下内容:
DECLARE @token VARCHAR(10) = 'bob';
DECLARE @replaceToken VARCHAR(10) = 'employee';
DECLARE @paddedToken VARCHAR(10) = ' ' + @token + ' ';
DECLARE @paddedReplaceToken VARCHAR(10) = ' ' + @replaceToken + ' ';
;WITH Step1 AS (
SELECT CommentorId
, QuestionId
, Comment
, REPLACE(Comment, @paddedToken, @paddedReplaceToken) AS [Value]
FROM AnswerComment
WHERE SurveyId = 90492
AND Comment LIKE '%' + @token + '%'
), Step2 AS (
SELECT CommentorId
, QuestionId
, Comment
, REPLACE([Value], @paddedToken, @paddedReplaceToken) AS [Value]
FROM Step1
), Step3 AS (
SELECT CommentorId
, QuestionId
, Comment
, IIF(CHARINDEX(LTRIM(@paddedToken), [Value]) = 1, STUFF([Value], 1, LEN(TRIM(@paddedToken)), TRIM(@paddedReplaceToken)), [Value]) AS [Value]
FROM Step2
)
SELECT CommentorId
, QuestionId
, Comment
, IIF(CHARINDEX(REVERSE(RTRIM(@paddedToken)), REVERSE([Value])) = 1,
REVERSE(STUFF(REVERSE([Value]), CHARINDEX(REVERSE(RTRIM(@paddedToken)), REVERSE([Value])), LEN(RTRIM(@paddedToken)), REVERSE(RTRIM(@paddedReplaceToken)))),
[Value])
FROM Step3;
但是我不知道如何实现。
[我找不到另一个建议使用%[^a-z0-9A-Z]%
进行搜索的线程,像这样:
update c
set c.Comment = REPLACE(c.Comment, en.FirstName, 'employee')
from AnswerComment c
join #EmployeeNames en on en.SurveyId = c.SurveyId
and c.Comment like '%' + en.FirstName + '%'
and c.Comment not like '%[^a-z0-9A-Z]%' + en.FirstName + '%[^a-z0-9A-Z]%'
select @@ROWCOUNT [first names replaced]
这对我不起作用。它替换了出现的雇员姓名,即使它们是一个较大的单词的一部分,例如在此示例中:
Input: 'I dislike dijon mustard.'
Name to search for: 'Jon'
Output: 'I dislike diemployee mustard.'
在我看来,这是不可能完成的。我如何实施这些方法有什么问题,或者我显然缺少什么?
类似的事情似乎起作用。
declare @input nvarchar(max) = 'I dislike dijon mustard. My boss Jon sucks.'
declare @name nvarchar(50) = 'Jon'
select replace(@input, ' ' + @name + ' ', ' employee ')