替换保留字列表中的列文本

Posted

技术标签:

【中文标题】替换保留字列表中的列文本【英文标题】:Replace column text from a list of reserved words 【发布时间】:2015-02-25 23:13:55 【问题描述】:

我有一个表变量,其中包含我想从查询结果中替换的单词列表。

我想在表变量中搜索这些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

【问题讨论】:

CLR 是一种选择吗?您可以有一个正则表达式,其模式是由交替运算符分隔的单词。 (word1|word2) 然后用空字符串替换匹配项。 可以this 帮忙吗? 【参考方案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,以获取产品级别的结果。

【讨论】:

以上是关于替换保留字列表中的列文本的主要内容,如果未能解决你的问题,请参考以下文章

+[NSPredicate predicateWithFormat] 替换保留字

如何在 Oracle 中转义保留字?

java有没有goto?保留字与关键字

Google BigQuery 旧语法的保留字列表

Python,节省时间的开始2保留字

DockerFile 保留字指令含义