SQL嵌套替换

时间:2012-10-26 14:32:56

标签: sql sql-server

我有一个复杂的嵌套替换,我用它来连接MSSQL中的两个表。

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中的数据包含一些 noise - 数字如 1160 1162 等等,表2是干净的字符。

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

现在,在我的情况下,我应该能够匹配作为一个条目。

我目前的嵌套替换方法确实有效,但我不相信这是一种优雅的方法。任何帮助都感激不尽。感谢

3 个答案:

答案 0 :(得分:4)

也许使用一个函数去除non-numeric characters

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 Fiddle with Demo

答案 1 :(得分: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
...

这至少可以摆脱疯狂的筑巢。它没有负面的性能影响。

答案 2 :(得分:0)

Bluefeet的建议肯定会让你的查询变得更加简单。但是,如果您不想使用某个功能并将所有代码保留在一个位置,请尝试此操作。在进行连接之前,您可以将表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