从保留字列表中替换列文本
Replace column text from a list of reserved words
我有一个 table 变量,其中包含我想从查询结果中替换的单词列表。
我想在 table 变量中搜索任何这些 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
这个Returns...
Product_ID NewCompanyName FindWord Col
100 null null Sony
100 Sony Inc LLC LLC
100 Sony LLC Inc Inc
我想要它 return 只有一个结果,并且 "LLC" 和 "Inc" 都将被删除,因为这些词在保留字中 table多变的。所以字符串 "Sony LLC Inc"
会是...
Product_ID NewCompanyName
100 Sony
首先,简化您的问题,只关注公司名称。 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
returns 是一个索引和单词。 (您可以在网络上找到执行此操作的 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,以获取产品级别的结果。
我有一个 table 变量,其中包含我想从查询结果中替换的单词列表。
我想在 table 变量中搜索任何这些 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
这个Returns...
Product_ID NewCompanyName FindWord Col
100 null null Sony
100 Sony Inc LLC LLC
100 Sony LLC Inc Inc
我想要它 return 只有一个结果,并且 "LLC" 和 "Inc" 都将被删除,因为这些词在保留字中 table多变的。所以字符串 "Sony LLC Inc"
会是...
Product_ID NewCompanyName
100 Sony
首先,简化您的问题,只关注公司名称。 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
returns 是一个索引和单词。 (您可以在网络上找到执行此操作的 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,以获取产品级别的结果。