Как заменить только следующее слово после строки поиска? - PullRequest
0 голосов
/ 10 января 2019

как я могу найти и заменить только следующее слово после строки поиска оператором выбора?

Например:

«Пользователь Mr Smith мне очень помог» -> Вывод: «Пользователь Mr X мне очень помог»

Строка поиска: «Мистер», и там много разных фамилий (по причинам защиты данных).

Спасибо:)

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Я не уверен, что вы задаете правильный вопрос. с вашим «заменить следующее слово» вы столкнетесь с проблемами. Судя по вашему примеру, это свободный ввод текста от конечного пользователя (при условии VARCHAR (MAX)), и трудно предсказать, какой вариант могут набрать конечные пользователи. поэтому вы могли бы искать предметы; - Мистер Смит

  • г. Smith
  • Мистер Смит
  • Мистар Смит (например, преднамеренная ошибка)
  • Миссис Смит
  • Мисс Смит
  • Мистер и миссис Смит (2 человека)
  • г. + Mrs & Miss Smith (Семья из 3 человек, конечные пользователи используют / не используют знаки препинания и используют разные символы AND)
  • Mrs & MrSmith (конечному пользователю не нужны пробелы для сущности)
  • Dr. Смит (или Док, или Док., Или Докт, или Докт., Или Доктор, или Доктор с орфографической ошибкой)
  • Prof. Смит (Проф. Или Профессор или Профессор или Профессор или Проф)
  • Отец Смит (фр.)
  • Преподобный Смит (rev
  • Эрл Смит
  • сэр Смит
  • Дам Смит
  • Леди Смит
  • Канцлер Смит
  • и т.д.. (Примечание: это просто английские заголовки, что если в тексте есть немецкий герр, французский месье или заголовок из любого другого языка?)

Также у вас есть вопрос «следующего слова», как насчет имен с двойными бочками, имен, которые разбиты дефисами или даже тех, которые содержат апострофы (например, мистер Смит Кэрролл / мистер Смит-Кэрролл / мистер О'Карролл)? В какой момент вы хотите, чтобы следующее слово закончилось? Следующее место? Следующая не фамилия? У вас есть список всех фамилий, чтобы это проверить?

Вам действительно нужно зашифровать БД, чтобы быть на 100% уверенным, что никакие данные не будут случайно заменены. Сделайте это протоколом, чтобы не допускать использования фактических имен в свободных текстовых полях, то есть отныне конечным пользователям следует вводить в текстовое поле «Mr X», но шифрование кажется вашим лучшим / самым безопасным вариантом.

0 голосов
/ 10 января 2019

Ниже приведен запрос, который поможет вам извлечь требуемый результат. Примечание: - Я использую ' addressstreet ' в качестве столбца, который можно заменить на ваш столбец и Box на Mr .

 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
0 голосов
/ 10 января 2019

Использование STUFF () Функция MSSQL. STUFF ()

...