MS SQL Server-替换名称,同时避免包含名称的单词

问题描述 投票:0回答:1

这是我第一次在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.'

在我看来,这是不可能完成的。我如何实施这些方法有什么问题,或者我显然缺少什么?

sql sql-server replace
1个回答
0
投票

类似的事情似乎起作用。

declare @input nvarchar(max) =  'I dislike dijon mustard. My boss Jon sucks.'
declare @name nvarchar(50) = 'Jon'

select replace(@input, ' ' + @name + ' ', ' employee ')
© www.soinside.com 2019 - 2024. All rights reserved.