Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 拆分地址字段_Sql_Sql Server_Sql Server 2008_Tsql_Sql Server 2014 - Fatal编程技术网

Sql 拆分地址字段

Sql 拆分地址字段,sql,sql-server,sql-server-2008,tsql,sql-server-2014,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2014,我有一个包含街道地址和邮政信箱号的地址栏。我想将街道地址和邮政编码提取到一个单独的栏中,我如何才能做到这一点 样本数据 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 期望输出:- 解析地址可能是一个很棘手的问题。这就是说,你

我有一个包含街道地址和邮政信箱号的地址栏。我想将街道地址和邮政编码提取到一个单独的栏中,我如何才能做到这一点

样本数据

     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
期望输出:-


解析地址可能是一个很棘手的问题。这就是说,你似乎正在关闭邮箱,所以这使它更易于管理

<>你说,你可能想考虑使用谷歌API来下载你的地址

这将通过规范化和清理字符串来产生所需的结果。然后,简单地解析字符串,然后通过XML和其他东西重建它

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

范例

返回

UDF如果感兴趣


解析地址可能是一个很棘手的问题。这就是说,你似乎正在关闭邮箱,所以这使它更易于管理

<>你说,你可能想考虑使用谷歌API来下载你的地址

这将通过规范化和清理字符串来产生所需的结果。然后,简单地解析字符串,然后通过XML和其他东西重建它

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

范例

返回

UDF如果感兴趣


请尝试一下。有关文档,请参见上述注释。我尝试使用SELECT PATINDEX“%[0-9]”,地址为[Number],地址为ABC的街道。但这里的问题是,即使是建筑编号或不需要的编号也会出现在输出中。您必须先清理数据,然后再拆分。请尝试一下。有关文档,请参见上述注释。我尝试使用SELECT PATINDEX“%[0-9]”,地址为[Number],地址为ABC的街道。但这里的问题是,即使建筑编号或不需要的编号也会出现在输出中。您必须先清理数据,然后再拆分。这太棒了,比我之前的工作要好得多。如果您在子查询B中挤出了双空格,并且可能还处理了该位上的P.i.e.尾随空格,可能会更好。这将防止邮政信箱被拆开。@SteveLovell谢谢。您可能会注意到,由于分隔符是空格,因此解析中消除了双空格。是的,在最终输出中没有双空格,但它们在B中的存在可能会导致异常。将15个N.MAIN STREET邮政信箱009和1个ABC CDE邮政信箱650添加到数据集中,看看我的意思。该死,HTML格式在我的第一个示例中删除了双空格,它应该在009之前。谢谢+1,我在一小时前就在处理它:D,谢谢@johncapelletti这太棒了,比我之前处理的要好得多。如果您在子查询B中挤出了双空格,并且可能还处理了该位上的P.i.e.尾随空格,可能会更好。这将防止邮政信箱被拆开。@SteveLovell谢谢。您可能会注意到,由于分隔符是空格,因此解析中消除了双空格。是的,在最终输出中没有双空格,但它们在B中的存在可能会导致异常。将15 N.MAIN STREET邮政信箱009和1 ABC CDE邮政信箱650添加到数据集中,以了解我的意思。该死,HTML格式在我的第一个示例中删除了双空格,它应该在009之前。谢谢+1,我1小时前正在处理它:D,谢谢@johncapelletti
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
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
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,< & >',',')