Заменить текст столбца из списка зарезервированных слов

У меня есть табличная переменная, которая содержит список слов, которые я хочу заменить из результатов запроса.

Я хочу найти любой из этих 600 слова в табличной переменной. Я сделал 3 только для этого примера. Затем я хочу заменить слово, если оно найдено. Я получаю результаты обратно, но они дублируют каждое слово. У меня есть UDF, который берет каждое слово в названии компании и проверяет соответствие.

 declare @findreservedwords table
(findWord varchar(50) primary key)

 INSERT INTO @findreservedwords
 VALUES
('Inc','LLC','Corp.')
--actually I have over 500 records in the @findreservedwords table variable.  Just 3 for this example 

select distinct p.product_id,replace(c.Company_Name,f.findword,'') as NewCompanyName,f.findWord,sep.col
 FROM PRODUCT p
INNER JOIN COMPANY c on p.Manufacturer_ID = c.company_id
CROSS APPLY dbo.SeparateValues(c.company_name, ' ') sep
LEFT OUTER JOIN @findreservedwords f on f.findWord = sep.col
WHERE p.product_id = 100

Это Возвращает...

Product_ID     NewCompanyName        FindWord      Col

100            null                   null         Sony
100            Sony Inc               LLC          LLC
100            Sony LLC               Inc          Inc

Я хотел бы, чтобы он возвращал только один результат, и "LLC" и "Inc" будут удалены, поскольку эти слова находятся в табличной переменной зарезервированных слов. Итак, строка "Sony LLC Inc"

было бы...

    Product_ID     NewCompanyName  
    100            Sony

1 ответ

Решение

Во-первых, упростите свой вопрос, чтобы сосредоточиться только на названии компании. join вернуться к product тривиально, но это усложняет запрос без необходимости.

Ваш основной запрос:

 select replace(c.Company_Name, f.findword,'') as NewCompanyName,
        f.findWord, sep.col
 FROM COMPANY c CROSS APPLY
      dbo.SeparateValues(c.company_name, ' ') sep LEFT OUTER JOIN   
      @findreservedwords f
      on f.findWord = sep.col;

Вы можете попытаться рекурсивно выполнить замену, используя рекурсивный CTE. Вместо этого повторно объедините имя вместе после удаления нежелательных слов. Я собираюсь предположить, что SeparateValues возвращает индекс, а также слово. (Ты можешь найти split() функции в Интернете, которые делают это. Итак, давайте перепроверяем значения вместе:

select c.Company_Name,
       stuff((select ' ' + sv.findword
              from dbo.SeparateValues(c.company_name) sv left outer join
                   @findreservedwords f
                   on f.findWord = sv.col  
              where f.findword is null
              order by sv.wordnumber
              for xml path ('concat')
             ).Value('/concat[1]', 'varchar(max)'), 1, 1, ''
            ) as NewCompanyName
from company c;

Вы можете использовать это как подзапрос или CTE в других запросах, чтобы получить результат на уровне продукта.

Другие вопросы по тегам