2016-08-03 93 views
0

我是Oracle的新手,我有一个要求从字符串解析美国街道地址,我尝试了几个选项与regexp substr,但没有给我想要的结果。解析街道地址Oracle并删除不需要的文本

这里是几个来自文本字符串的例子。

XYZ 123本身形成了鲜明的日服401
XYX 123 39 AVE NE第二FLR的n-3
XYZ 213内布拉斯加州勇气方式E-1

而且我的输出应该是:
123 SE鲜明ST
123 39 AVE NE
213内布拉斯加州的勇气方式

我至今SQL:

SELECT UPPER (
      REGEXP_SUBSTR (REPLACE ('xyz 2551 38th ave ne tc 2', 'xyz '), 
         '((^[0-9]{1,9}+[ ]+[0-9]{1}[/]+[0-9]{1})|(^[0-9]+))')) 
      AS houseno, 
     TRIM (
      UPPER (
      REGEXP_SUBSTR (
       REPLACE ('xyz 2551 38th ave ne tc 2', 'xyz '), 
       '[^0-9]+((1()st|1st)|(2()nd|2nd)|(3()rd|3rd)|([1234567890]+()th|[1234567890]+th)) +(ave(nue)?|st(reet)?|boulevard|blvd)[[:print:]]*|P(.)O(.)()+Box()[0-9]+|[a-z][[:print:]]*', 
       1, 
       1, 
       'i'))) 
      AS street_addrerss,  
     UPPER (REPLACE ('xyz 2551 38th ave ne tc 2', 'xyz ')) AS orginal_text 
    FROM DUAL; 

在此先感谢!

+0

这听起来不公平。从你展示的字符串中提取地址是一个非常困难的问题 - 他们把它交给了甲骨文的新手,对于如何解决这个问题没有任何建议?你应该如何识别地址是什么以及什么是“不必要的文本”?他们是否给出了任何规则? – mathguy

+0

要求是从字符串中提取街道地址并将这些数据加载到Oracle DB中。他们并不担心地址线2. – nissamps

+0

我认为我的问题很容易理解,但我会再试一次。通过查看您的输入字符串,您如何知道街道地址(第1行)的开始位置以及结束位置?例如:您可以说“地址从字符串中的第一个数字开始。”很公平;这是否意味着在地址之前的垃圾中不能有任何数字?自从?好的,如果可以保证的话,那很好,很有用。那么,你如何确定地址结束和剩余的“垃圾”开始? – mathguy

回答

0

这是一个略显一般的方法...它假定地址开始在字符串中的第一个数字(所以可能永远不会包含数字地址前的“无用”的文本),地址总是以结束st,str,street,av,ave,avenue,way,rt,route,blvd,有或没有一段时间。你将不得不维护这个列表,因为还有很多其他的可能性。

它还假定输入字符串中的所有内容都是小写的(如果不是这样,可以将lower_case应用于输入字符串,然后将结果地址初始化 - 我不担心这一点)。如果您不需要终端时间段(。),无论地址是否包含它,您都可以删除。从搜索字符串的末尾开始。

with 
    input_strings (str) as (
     select 'xyz 123 se stark st suit 401'  from dual union all 
     select 'xyx 123 39th ave ne 2nd flr n-3' from dual union all 
     select 'xyz 213 nebraska courage way e-1' from dual union all 
     select '2 new way blvd. apt 33'   from dual 
    ) 
select regexp_substr(str, '\d.*(st|str|street|av|ave|avenue|way|rt|route|blvd).?') 
                       as address 
from input_strings 
; 

ADDRESS 
------------------------------ 
123 se stark st 
123 39th ave 
213 nebraska courage way 
2 new way blvd. 
+0

非常感谢,它的工作。我添加了其他可能的结束字符串并可以看到所需的结果 – nissamps

-1

假设你希望第一个空间,直至空号后重返一切5.

的第一空间的位置是:第5空间instr(<string>,' ',1,1) 的位置是:instr(<string>,' ',1,5)

了substr函数来得到你需要的一部分字符串。

select substr('xyz 123 se stark st suit 401' 
      ,instr('xyz 123 se stark st suit 401', ' ') + 1 
      ,instr('xyz 123 se stark st suit 401', ' ', 1, 5) - instr('xyz 123 se stark st suit 401', ' ') - 1) 
    from dual 
+0

这不是一个可行的解决方案,我同意它适用于某些场景,但不是我拥有的所有数据。 – nissamps