0

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

Я хочу найти любое из этих слов 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 

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

бы ...

Product_ID  NewCompanyName 
    100   Sony 
+0

Является ли CLR параметром? У вас может быть регулярное выражение с шаблоном, являющимся словами, разделенными оператором чередования. '(Word1 | word2)', а затем заменяет совпадения с пустой строкой. –

+0

Возможно [это] (http: // stackoverflow .com/questions/28727375/search-and-replace-a-string-t-sql) help? – HABO

ответ

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; 

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

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; 

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