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,< & >',',')