2016-12-02 20 views
1

で複数の文字フレーズの交換、私は以下のSQLテーブルを持っている(注:それが簡単略語リストSQL

Table1.Description 
"HOUSING,WRAP RECESSED" 
"HOUSING,ASSEMBLY 2-FEED" 
"LENS,FLUSH SUS" 

Table2.Abbreviations 
ASSY = ASSEMBLY 
FD = FEED 
FLUSH = FL 
HSG = HOUSING 
LENS = LNS  
RECESSED = REC 

を読むために作るために使用される引用は私が更新、または交換の線に沿って何かして作成したいです新しいテーブル(のいずれかで結構です)Table2.Abbreviationsと、Table1.Descriptionそれは次のようになります。

Table1.Description 
"HSG,WRAP REC" 
"HSG,ASSY 2-FD" 
"LNS,FL SUS" 

私はこの要求、初めてのポスターの形式を謝るが、多くのこのサイトを使用しています回!

+0

一つのアプローチ(必ずしも最良のもの)は、表1の各行を通過し、使用して、必要に応じて何度でも文字列置換を実行するための手順を実行するために、カーソルを使用することです表2からのデータは置換えが行なわれなくなるまで繰り返す。 – uncoder

+0

置換が重複する可能性はありますか? 「FOOD」は「FD」になり、「FOO」は「FU」になります。もしそうなら、置換を試みる前に入力文字列を "トークン化"するCappelletti博士のような解決策が必要です。置換が再帰的に起こる可能性がある場合、もう1つの楽しみが生じる。 「FOOD WRAP」は「FD WRP」となり、「WRP」は「RP」となる。あなたは一番下に置き換えておきたいのですか? – HABO

+0

@HABO、これまでのすべてのアプローチは* row-by-row *です。置換のソート順があることを考えると、これは問題ありません。あるフレーズを他のフレーズに置き換えて、他のフレーズの後でフレーズを置き換えることもできます。私のプロジェクトの1つでは、すべての置換えを含む*キーと値のペア* -XMLとNVARCHAR(MAX)という2つのパラメータを持つ関数を使用します。テンプレートからCDAドキュメントを作成するための複雑な*マルチレベル*アクションにこれを使用します。 1つの文書のみを扱う限り、これは驚くほど高速です。 – Shnugo

答えて

0

このようにそれを試してみてください:

テーブルを魔法

をやって、あなたの略語

CREATE TABLE Abbreviations (LongTerm VARCHAR(100),ShortTerm VARCHAR(10)); 
INSERT INTO Abbreviations VALUES 
('ASSEMBLY','ASSY') 
,('FEEd','FD') 
,('FLUSH','FL') 
,('HOUSING','HSG') 
,('LENS','LNS') 
,('RECESSED','REC'); 

GO 

機能のために、私はこれを行う方法を説明するために一時テーブルを使用してソリューションを作成しました

CREATE FUNCTION dbo.ReplaceAbbreviations(@string VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) AS 
BEGIN 
    SELECT @string=REPLACE(@string,LongTerm,ShortTerm) 
    FROM Abbreviations; 

    RETURN @string; 
END 
GO 

ひも付きのテーブル

CREATE TABLE YourDescription (LongDescription VARCHAR(MAX)); 
INSERT INTO YourDescription VALUES 
('HOUSING,WRAP RECESSED') 
,('HOUSING,ASSEMBLY 2-FEED') 
,('LENS,FLUSH SUS'); 
GO 

、動的SQLおよびグローバル検索を使用してテストシナリオ

DROP TABLE YourDescription; 
DROP FUNCTION dbo.ReplaceAbbreviations; 
DROP TABLE Abbreviations; 

に別のオプションを結果ここ

LongDescription   ShortDescription 
HOUSING,WRAP RECESSED  HSG,WRAP REC 
HOUSING,ASSEMBLY 2-FEED HSG,ASSY 2-FD 
LENS,FLUSH SUS    LNS,FL SUS 
0

一般的な戦略は、各単語/略語のペアを調べ、各ペアに基​​づいてTable1.Descriptionを更新することです。

CREATE TABLE #table1 (descr VARCHAR(1000)) 
CREATE TABLE #abbr (word VARCHAR(1000), abr VARCHAR(1000), processed int) 

DECLARE @word VARCHAR(1000) 
DECLARE @abbr VARCHAR(1000) 

INSERT INTO #table1 
     (descr) 
VALUES ('HOUSING,WRAP RECESSED' -- descr - varchar(1000) 

     ), 
      ('HOUSING,ASSEMBLY 2-FEED' -- descr - varchar(1000) 

     ), 
      ('LENS,FLUSH SUS' -- descr - varchar(1000) 

     ) 

INSERT INTO #abbr 
     (word, abr, processed) 
VALUES ('ASSEMBLY', -- word - varchar(1000) 
      'ASSY' -- abr - varchar(1000) 
      ,0 
     ), 
      ('FEED', -- word - varchar(1000) 
      'FD' -- abr - varchar(1000) 
      ,0 
     ), 
      ('FLUSH', -- word - varchar(1000) 
      'FL' -- abr - varchar(1000) 
      ,0 
     ), 
      ('HOUSING', -- word - varchar(1000) 
      'HSG' -- abr - varchar(1000) 
      ,0 
     ), 
      ('LENS', -- word - varchar(1000) 
      'LNS' -- abr - varchar(1000) 
      ,0 
     ), 
      ('RECESSED', -- word - varchar(1000) 
      'REC' -- abr - varchar(1000) 
      ,0 
     ) 


WHILE EXISTS (SELECT * FROM #abbr WHERE processed = 0) 
BEGIN 
    SELECT TOP 1 @word = word, @abbr = abr FROM #abbr WHERE processed = 0 

    UPDATE #table1 
    SET descr = REPLACE(descr,@word,@abbr) 

    UPDATE #abbr 
    SET processed = 1 
    WHERE word = @word AND abr = @abbr 
END 

SELECT * FROM #table1 
+1

手続き的思考の暗闇の中を歩いています。いい加減にして!セットベースのアプローチの洞察に進む。ループとカーソルを考案したproc devilは、貧しいデータベースの人々をセットベースの解決策の恩恵から守るために考案しました。正直言って:私の解決策は - *魔法の瞬間*隠された* RBARも*です。そして、正直なところ2:そうです、「ホイール」(または「カーソル」)がいい選択ですが、これらの状況はまれです... – Shnugo

1

をされるクリーニング機能

SELECT LongDescription 
     ,dbo.ReplaceAbbreviations(LongDescription) AS ShortDescription 
FROM YourDescription; 
GO 

を使用して選択し&シンプル置き換えます。このプロセスは、衝突を避けるために文字列を本質的に「トークン化」します。

省略形は、2つのフィールド(From、To)の中にあることに注意してください。提供されたサンプルのカップルが矛盾しているように見えました(Long> ShortとLong to Long)。

Declare @Table1 table (ID int,Description varchar(500));Insert into @Table1 values (1,'HOUSING,WRAP RECESSED'),(2,'HOUSING,ASSEMBLY 2-FEED'),(3,'LENS,FLUSH SUS') 
Declare @Table2 table (MapFrom varchar(50),MapTo varchar(50));Insert Into @Table2 values 
('ASSEMBLY','ASSY'), 
('FEED' ,'FD'), 
('FLUSH' ,'FL'), 
('HOUSING' ,'HSG'), 
('LENS' ,'LNS'), 
('RECESSED','REC') 

Declare @SQL varchar(max)='' 
Select @SQL = @SQL+concat(',(',ID,',''||',replace(Description,'''',''''''),'||'')') From @Table1 --Where ID=2 
Select @SQL = Replace(@SQL,MapFrom,MapTo) 
From (
     Select MapFrom=' ',MapTo='|| ||' 
     Union All 
     Select ',','||,||' 
     Union All 
     Select '-','||-||' 
     Union All 
     Select MapFrom = '||'+ltrim(rtrim(MapFrom))+'||' 
       ,MapTo = ltrim(rtrim(MapTo)) 
      From @Table2 
      Union All 
      Select '||','' -- Remove Any Remaining | 
     ) A 
Select @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)' 
Exec(@SQL) 

戻り

ID Value 
1 HSG,WRAP REC 
2 HSG,ASSY 2-FD 
3 LNS,FL SUS 
+0

混乱してもお詫び申し上げますが、「=」は値に含まれていません。私はちょうど住宅の略語がHSGであると言っているようにしようとしていました。したがって、実際には2つの列です。それが明確になるのに役立つのでしょうか?しかし、ありがとう!あなたが持っているなら、私は間違いなく更新を見たいと思います。お時間を割いていただきありがとうございます! – SeanDon

+0

2つのフィールド名は何ですか? –

+0

@SeanDon更新された回答を参照してください。表2では、2つのフィールドMapFromとMapToを持っています –