我有点不寻常需要从单独的表中的值中查找/替换字符串中的值。
基本上,我需要标准化一堆地址,其中一个步骤是用Street,Road或Boulevard替换St,Rd或Blvd之类的东西。我打算用一堆嵌套的REPLACE()语句编写一个函数,但这是1)低效的; 2)不实用。根据USPS网站,街道类型有500多种可能的缩写。
我想做的事情类似于:
REPLACE(Address1,Col1,Col2)其中col1和col2是单独表格中的缩写和完整街道类型。
任何人都对这样的事情有任何见解吗?
答案 0 :(得分:0)
您可以使用递归CTE进行此类替换。像这样:
with r as (
select t.*, row_number() over (order by id) as seqnum
from replacements
),
cte as (
select replace(t.address, r.col1, r.col2) as address, seqnum as i
from t cross join
r
where r.seqnum = 1
union all
select replace(cte.address, r.col1, r.col2), i + 1
from cte join
r
on r.i = cte.i + 1
)
select cte.*
from (select cte.*, max(i) over () as maxi
from cte
) cte
where maxi = i;
那就是说,这基本上是迭代。在每行有500个替换的表上执行此操作将非常昂贵。
SQL可能不是最好的工具。