我有一个复杂的嵌套替换,我用它来连接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'
现在,在我的情况下,我应该能够匹配作为一个条目。
我目前的嵌套替换方法确实有效,但我不相信这是一种优雅的方法。任何帮助都感激不尽。感谢
答案 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
答案 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