【问题标题】:Split Address field拆分地址字段
【发布时间】:2017-10-06 23:15:01
【问题描述】:

我有一个地址列,其中包含街道地址和邮政信箱号。我想将街道地址和邮政编码提取到一个单独的列中,我该怎么做?

样本数据

     1 ABC CDE PO BOX 650
       15 N. MAIN STREET P.O. BOX 009
       (ABC)PO BOX 5909 
        1 TAKEWAY PLAZA          
       PO BOX 146012  Parkway STREET

期望的输出:-

STREET ADDRESS               ADDRESS2


  1 ABC CDE                    P.O. BOX 650
  15 N. MAIN STREET            P.O. BOX 009
  ABC                          P.O. BOX 5909
  1 TAKEWAY PLAZA
  Parkway STREET               P.O. BOX 146012

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql sql-server-2014


【解决方案1】:

解析地址可能是一个滑坡。也就是说,您似乎正在关闭邮政信箱,这样它就更易于管理了,

也就是说,您可能需要考虑使用 GOOGLE API 来规范化您的地址 Address standardization within a database

这将通过规范化和清理字符串来产生所需的结果。然后就是简单的解析字符串,然后通过 XML 和 Stuff() 重构它。

有许多可用的解析/拆分函数,我在下面提供了我的

示例

Declare @YourTable table (address varchar(250))
Insert Into @YourTable values
('1 ABC CDE PO BOX 650'),
('15 N. MAIN STREET P.O. BOX 009'),
('(ABC)PO BOX 5909'),
('1 TAKEWAY PLAZA'),          
('PO BOX 146012  Parkway STREET')

Select A.*
      ,C.*
 From  @YourTable A
 Cross Apply (
               Select CleanString = replace(replace(replace(replace(replace(replace(replace(A.Address,'  ',' '),'P. O','P.O'),'P.','P'),'O. ','O'),'O BOX','OBOX'),'BOX ','BOX'),'POBOX',' POBOX')+' '
             ) B
 Outer Apply (
                Select Address1 = Stuff((Select ' ' +RetVal 
                                         From  [dbo].[udf-Str-Parse](B.CleanString,' ')
                                         Where RetVal Not Like 'POBOX%'
                                         For XML Path ('')),1,1,'')
                      ,Address2 = (Select replace(RetVal,'POBOX','P.O. Box ') From  [dbo].[udf-Str-Parse](B.CleanString,' ') Where RetVal Like 'POBOX%')
             ) C

退货

address                         Address1            Address2
1 ABC CDE PO BOX 650            1 ABC CDE           P.O. Box 650
15 N. MAIN STREET P.O. BOX 009  15 N. MAIN STREET   P.O. Box 009
(ABC)PO BOX 5909                (ABC)               P.O. Box 5909
1 TAKEWAY PLAZA                 1 TAKEWAY PLAZA     NULL
PO BOX 146012  Parkway STREET   Parkway STREET      P.O. Box 146012

有兴趣的 UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From  (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')

【讨论】:

  • 这太棒了,比我之前的工作要好得多。如果您在子查询 B 中挤出双空格(并且可能还处理 P. (即该位上的尾随空格)),可能会更好。这将防止邮政信箱“分裂”。
  • @SteveLovell 谢谢。您可能会注意到,由于分隔符是空格,因此解析消除了双空格
  • 是的,最终输出中没有双空格,但它们在 B 中的存在会导致奇怪。将15 N. MAIN STREET P.O. BOX 0091 ABC CDE P. O. BOX 650 添加到数据集中,看看我的意思。
  • 该死,HTML 格式在我的第一个示例中删除了双空格,它应该在 009 之前。
  • 谢谢 + 1,我 1 小时前正在处理它:D,谢谢@JohnCappelletti
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2023-04-03
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多