HL8*_*HL8 1 sql sql-server-2008
我有一个地址列,其中包含地址,州和邮政编码.我想将地址,郊区,州和邮政编码提取到单独的列中,如何做到这一点作为地址的长度是可变的,有一个^来分隔地址和"其他"细节.状态可以是2或3个字符长,邮政编码总是4个字符长.
PostalAddress TO BE Address Suburb State Postcode
28 Smith Avenue^MOOROOLBARK VIC 3138^ 28 Smith Avenue MOOROOLBARK VIC 3138
16 Farr Street^HEYFIELD VIC 3858^ 16 Farr Street HEYFIELD VIC 3858
17 Terry Road^LOWER PLENTY VIC 3093^ 17 Terry Road LOWER PLENTY VIC 3093
Run Code Online (Sandbox Code Playgroud)
SQL中的字符串解析很混乱,往往很脆弱.我通常认为最好在SQL之外完成这些任务.也就是说,鉴于上面的迷你规范,可以将数据解析为您想要的字段,如下所示:
select
left(PostalAddress, charindex('^', PostalAddress) - 1) as street_address,
left(second_part, len(second_part) - charindex(' ', reverse(second_part))) as suburb,
right(second_part, charindex(' ', reverse(second_part))) as state,
reverse(substring(reverse(PostalAddress), 2, 4)) as postal_code
from (
select
PostalAddress,
rtrim(reverse(substring(reverse(PostalAddress), 6, len(PostalAddress) - charindex('^', PostalAddress) - 5))) as second_part
from Addresses
) as t1
Run Code Online (Sandbox Code Playgroud)
请注意,您需要将表名替换为我在上面的子查询中调用的地址.
您可以在此处看到针对您的示例数据的操作.