2017-09-13 1 views
1

Sagen wir, ich habe eine 2-Spalten-Tabelle, in 1. Spalte. ist eine Kontonummer und in der 2. persönlichen Client ID ABER in einem langen String. In dieser Zeichenfolge sein können einige verschiedene Kunden-IDs und jeder beginnt mit „ID“SQL - Empfangen mehrerer Muster aus einer Zeichenfolge

|account_no | note 
|12345  | AAAAID1111BBBBID2222CCACAID3333JDBSTGDid4444 

Wie kann ich ein solches Ergebnis jeweils in einreihige ?: erhalten

account_no|ID 
12345  1111 
12345  2222 
... 
1234  4444 

regexp_substr(upper(note), 'ID[[:digit:]]{4}') mit es gibt mir nur die erste ID von der ganzen Schnur.

Jede Schleife oder gibt es einen Trick mit Regexps?

+1

Dies könnte helfen. https://stackoverflow.com/documentation/oracle/1968/splitting-delimited-strings#t=20170913180219287842 –

Antwort

1

Verwenden Sie CONNECT BY, um durch die Zeichenfolge zu gehen, wobei nach Groß- und Kleinschreibung der Buchstaben "ID" gefolgt von 1 oder mehr Ziffern gesucht wird, optional gefolgt vom Ende der Zeile, um die letzte Zeile abzufangen. Wenn sie gefunden wird, holen Sie sich die zweite Gruppierung, die der Nummerenteil der Übereinstimmung ist, wie durch die Umgebung mit Klammern angezeigt.

with tbl(account_no, note) as (
    select 12345, 'AAAAID1111BBBBID2222CCACAID3333JDBSTGDid4444' from dual 
) 
select account_no, 
     regexp_substr(note, '(ID(\d+))$?', 1, level, 'i', 2) ID 
from tbl 
connect by level <= regexp_count(note, 'ID\d+', 1, 'i'); 
+0

Danke euch beiden! Gary_W es funktioniert perfekt. Patrick, großartige Basis, um meine Fähigkeiten zu verbessern. Danke noch einmal. – alektre

Verwandte Themen