4

我有一个复杂的嵌套替换,我用它来连接 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 中的数据包含一些噪音- 数字如11601162等,其中 Table2 是干净的字符。

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

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

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

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 Fiddle

于 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 的建议肯定会很好地使您的查询更简单。但是,如果您不想打扰一个函数并将所有代码保存在一个地方,试试这个。在进行联接之前,您可以将表 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 回答