をされるクリーニング機能
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
一つのアプローチ(必ずしも最良のもの)は、表1の各行を通過し、使用して、必要に応じて何度でも文字列置換を実行するための手順を実行するために、カーソルを使用することです表2からのデータは置換えが行なわれなくなるまで繰り返す。 – uncoder
置換が重複する可能性はありますか? 「FOOD」は「FD」になり、「FOO」は「FU」になります。もしそうなら、置換を試みる前に入力文字列を "トークン化"するCappelletti博士のような解決策が必要です。置換が再帰的に起こる可能性がある場合、もう1つの楽しみが生じる。 「FOOD WRAP」は「FD WRP」となり、「WRP」は「RP」となる。あなたは一番下に置き換えておきたいのですか? – HABO
@HABO、これまでのすべてのアプローチは* row-by-row *です。置換のソート順があることを考えると、これは問題ありません。あるフレーズを他のフレーズに置き換えて、他のフレーズの後でフレーズを置き換えることもできます。私のプロジェクトの1つでは、すべての置換えを含む*キーと値のペア* -XMLとNVARCHAR(MAX)という2つのパラメータを持つ関数を使用します。テンプレートからCDAドキュメントを作成するための複雑な*マルチレベル*アクションにこれを使用します。 1つの文書のみを扱う限り、これは驚くほど高速です。 – Shnugo