如何只替换搜索字符串后的下一个单词?

时间:2019-01-10 09:36:14

标签: sql replace find

如何用select语句仅查找和替换搜索字符串后的下一个单词?

例如:

“用户Smith先生帮了我很多”->输出:“用户X先生帮了我很多”

搜索字符串是“ Mr”,姓氏很多(出于数据保护的原因)。

谢谢:)

3 个答案:

答案 0 :(得分:1)

我不确定您问的是正确的问题。 用“替换下一个单词”,您将遇到问题。 从您的示例的外观来看,这是来自最终用户的自由文本输入(假设VARCHAR(MAX)),并且很难预测最终用户可以输入的版本。 因此,您可以找到搜索项;    -史密斯先生

  • 先生史密斯
  • 史密斯先生
  • Mistar Smith(例如故意拼写错误)
  • 史密斯夫人
  • 史密斯小姐
  • 史密斯夫妇(2人)
  • 先生+史密斯夫妇(3人家庭,最终用户使用/不使用标点符号,并使用不同的AND符号)
  • Mrs&MrSmith(最终用户不希望为实体添加空格)
  • 博士Smith(或Doc或Doc。或Doct或Doct。或Doctor或拼写错误的Docter)
  • 教授史密斯(教授或教授或教授或教授或教授)
  • 史密斯父亲(Ftr。)
  • 史密斯(rev
  • 史密斯伯爵
  • 史密斯爵士
  • 史密斯夫人
  • 史密斯夫人
  • 史密斯大臣
  • 等(注意:这些只是英文标题,如果文本中有德国人,法国先生或其他语言的标题怎么办?)

您还会遇到“下一个单词”的问题,双桶名称,连字符或什至包含撇号的名称(例如史密斯·卡洛尔先生/史密斯·卡洛尔先生/奥卡洛尔先生)会怎样? 您想在什么时候结束下一个单词?下一个空间?下一个非姓氏?您是否有所有姓氏清单可用来对照?

您确实需要对数据库进行加密,以确保100%确保不会意外替换任何数据。 使其成为协议,禁止在自由文本框中使用实际名称,即从现在开始让最终用户在文本框中键入“ Mr X”,但是加密似乎是您最好/最安全的选择。

答案 1 :(得分:0)

使用MSSQL的 STUFF()功能。 STUFF()

答案 2 :(得分:0)

下面是一个查询,它将帮助您提取所需的结果。 注意:-我使用的是“ 地址街道”列,您可以用“ 您的列”和“ Box ”用“ 先生。

 WITH CTE AS (
 SELECT  SUBSTRING(addressstreet ,1,(CHARINDEX(' BOX ',addressstreet  + ' ')-1))TEST0,REPLACE(SUBSTRING([addressstreet], CHARINDEX('BOX ', [addressstreet]), LEN([addressstreet])),'BOX','')test, addressstreet FROM [dbo].[Vendor]
  where addressstreet like '% BOX %')
  ,CTE2 AS(
  SELECT TEST0, ltrim(stuff(TEST,1,charindex(' ',TEST),''))TEST1, ADDRESSSTREET  FROM CTE
  )

  SELECT TEST0 + ' Mr X '+ ltrim(stuff(TEST1,1,charindex(' ',TEST1),'')) RequiredOutput, ADDRESSSTREET from cte2

此SQL语句不是性能最佳查询,但是您可以实现目标。

输出:-

RequiredOutput                          AddressStreet
P.O. Mr X Street Plaza                  P.O. BOX 32109 Street Plaza