2016-08-03 8 views
0

Ich bin Neuling zu Oracle und ich habe eine Anforderung, US-Street-Adresse von einer Zeichenfolge zu analysieren, habe ich einige Optionen mit regexp substr ausprobiert, aber gab mir nicht das gewünschte Ergebnis.Parsing Street Adresse Oracle und entfernen Sie unerwünschte Texte

Hier sind einige Beispiele aus Textzeichenfolge.

xyz 123 se stark st Anzug 401
xyx 123 39th ave ne 2. flr n-3
xyz 213 nebraska Mut Art und Weise e-1

Und sollte meine Ausgabe sein:
123 se stark st
123 39th ave ne
213 nebraska Mut Weg

My SQL bisher:

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; 

Vielen Dank im Voraus !!

+0

Das klingt unfair. Es ist ein sehr schwieriges Problem, eine Adresse aus Zeichenketten zu extrahieren, wie du sie zeigst. Sie haben sie einem Neuling in Oracle gegeben, ohne Vorschläge, wie man sie lösen könnte. Wie soll man erkennen, was die Adresse ist und was ist der "unnötige Text"? Haben sie irgendwelche Regeln dafür gegeben? – mathguy

+0

Die Anforderung besteht darin, die Straßenadresse aus einer Zeichenfolge zu extrahieren und diese Daten in Oracle DB zu laden. Sie sind nicht besorgt um die Adresszeile 2. – nissamps

+0

Ich dachte, meine Frage war leicht zu verstehen, aber ich werde es noch einmal versuchen. Wie wissen Sie anhand Ihrer Eingabezeichenfolgen, wo die Straßenadresse (Zeile 1) beginnt und wo sie endet? Zum Beispiel: Sie können sagen "die Adresse beginnt an der ersten Ziffer in der Zeichenfolge." Meinetwegen; bedeutet das, dass Sie keine Ziffern im "Müll" vor der Adresse haben können? Je? OK, wenn das garantiert werden kann, ist das gut und nützlich. Wie bestimmen Sie dann, wo die Adresse ENDS und der verbleibende "Müll" beginnt? – mathguy

Antwort

0

ist hier ein etwas allgemeiner Ansatz ... es die Adresse übernimmt an der ersten Stelle in der Zeichenfolge beginnt (so den „nutzlos“ Text vor der Adresse darf niemals Ziffern enthalten) und die Adresse endet immer mit st, str, straße, av, ave, avenue, weg, rt, route, blvd, mit oder ohne eine zeit nach ihnen. Sie müssen diese Liste pflegen, da es viele andere Möglichkeiten gibt.

Es nimmt auch an, dass alles in der Eingabezeichenfolge in Kleinbuchstaben ist (wenn nicht, können Sie low_case auf die Eingabezeichenfolge anwenden und dann in die resultierende Adresse initiieren - ich werde mich nicht darum kümmern). Wenn Sie den Terminal-Zeitraum (.) Nicht möchten, unabhängig davon, ob eine Adresse ihn enthält oder nicht, können Sie löschen. vom Ende des Suchstrings.

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

Vielen Dank, es hat funktioniert. Ich fügte die verbleibenden möglichen End-Saiten hinzu und konnte das gewünschte Ergebnis sehen. – nissamps

-1

Vorausgesetzt, dass Sie alles, was nach dem ersten Platz bis Raumnummer 5.

Position des ersten Raumes ist zurückkehren wollen: instr(<string>,' ',1,1) Position des 5. Platz ist: instr(<string>,' ',1,5)

Verwenden Sie die Funktion substr die bekommen Teil der Zeichenfolge, die Sie benötigen.

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

Dies ist keine praktikable Lösung, ich stimme zu, dass es mit bestimmten Szenarien funktioniert, aber nicht mit allen Daten, die ich habe. – nissamps