4

MSSQL で 2 つのテーブルを結合するために使用している複雑なネストされた置換があります。

select * from A
  left outer join 
select * from B
on
  replace(
     replace(
        replace(
           replace(
              replace(A.Column1, '1114', ''),
             '1160', ''), 
          '1162', ''),
        '1167', ''),
      '1176', ''),
    '1177', '')  = B.Column1

私がこれを行っている全体的な理由は、 Table1 のデータにいくつかのノイズが含まれているためです。 11601162などの数値で、 Table2 はクリーンな文字です。

Eg. - Table 1 - 'HELLO1160WORLD'
      Table 2 - 'HELLOWORLD'

私の状況では、それらを 1 つのエントリとして一致させることができるはずです。

ネストされた置換の現在のアプローチは機能しますが、これがエレガントな方法であるとは確信していません。どんな助けでも大歓迎です。ありがとう

4

3 に答える 3

4

たぶん、関数を使用して非数字を削除します。

Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    While PatIndex('%[^a-z]%', @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex('%[^a-z]%', @Temp), 1, '')

    Return @Temp
End

次に、結合でこの関数を参照します。

select a.col1 a, b.col1 b
from tablea a
left join tableb b
  on dbo.RemoveNonAlphaCharacters(a.col1) = b.col1

SQL FiddlewithDemoを参照してください

于 2012-10-26T14:45:08.420 に答える
3

問題は、T-SQLでは式に名前を付けることが簡単にできないため、別の場所から式を参照できることです。ただし、これを行う方法があります。

select replaceN
from T
cross apply (select replace1 = replace(T.col, 'x', 'y')) r1
cross apply (select replace2 = replace(replace1, 'x', 'y')) r2
cross apply (select replace3 = replace(replace2, 'x', 'y')) r3
...

これは少なくともクレイジーな入れ子を取り除きます。パフォーマンスへの悪影響はありません。

于 2012-10-26T15:27:50.073 に答える
0

Bluefeet の提案は、クエリをより簡単にするのに非常に役立ちます。ただし、関数に煩わされず、すべてのコードを 1 か所に保持したくない場合は、これを試してください。結合を行う前に、テーブル A をステージング テーブルにダンプできます。

DECLARE @TmpA TABLE(
     Column1 [nvarchar] (50)),
     ...
     )

Insert into @tmpA select * from A

Update @TmpA set Column1=Replace(Replace(Replace(Column1,...)))

Select * from tmpA
  left outer join 
Select * from B
  on tmpA.Column1=B.Column1
于 2012-10-26T15:10:46.450 に答える