【问题标题】:SQL Server 2008 - separating Address fieldSQL Server 2008 - 分隔地址字段
【发布时间】:2016-11-28 12:25:59
【问题描述】:

我有一个包含地址、州和邮政编码的地址列。我想将地址、郊区、州和邮政编码提取到单独的列中,因为地址的长度是可变的,如何做到这一点,有一个 ^ 来分隔地址和“其他”详细信息。州可以是 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  

【问题讨论】:

  • 这是一次性任务还是您需要的任何持续功能?

标签: sql sql-server-2008


【解决方案1】:

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

请注意,您需要在上面的子查询中用您的表名替换我所说的地址。

您可以在您的示例数据here 上看到这一点。

【讨论】:

  • 您好,感谢您的帮助。但我收到以下错误,Msg 536, Level 16, State 3, Line 1 Invalid length parameter passing to the substring function.
  • 该错误意味着某些字段的格式与其他字段的格式不同(可能缺少插入符号等)
  • 也可以运行,SELECT * FROM Addresses WHERE Charindex('^',PostalAdress)=0 来识别问题记录
  • @Sparky:这要简单得多。谢谢!我担心导致错误的其他表达式之一,但仔细想想,它可能是缺少^
  • 是的,它可能是其他的东西,但我怀疑它是丢失的 ^。顺便说一句很好的答案
【解决方案2】:

在我的例子中,它只是从一个字符串中获取一个五个数字作为邮政编码:

下面是我的代码:

Select SUBSTRING([Column or string],patindex('%[0-9][0-9][0-9][0-9][0-9]%',[Column or string]),5) AS 'Postcode'

【讨论】:

  • 对不起,上面没有提到,这是答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多