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

結果を 1 つだけ返してもらいたいのですが、「LLC」と「Inc」の両方が削除されます。これらの単語は予約語テーブル変数にあるためです。文字列「Sony LLC Inc」

だろう...

    Product_ID     NewCompanyName  
    100            Sony
4

1 に答える 1

1

まず、質問を単純化して、会社名だけに焦点を当てます。joinback toproductは簡単ですが、クエリが不必要に複雑になります。

あなたの基本的なクエリは次のとおりです。

 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単語だけでなくインデックスも返すと仮定します。(これを行う関数は Web で見つけることができます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 として使用して、製品レベルで結果を取得できます。

于 2015-02-25T23:58:51.280 に答える