2016-09-12 4 views
0

Ich habe 15 Zeichenkette und muss durchlaufen durch Ziehen der Position des Auftretens des Buchstaben "a". Ich wollte einen Cursor verwenden, um die Zeichenfolge zu durchlaufen, war mir aber nicht sicher, wie ich die einzelnen Positionen speichern konnte.Oracle Instr Position

+1

Bitte fügen Sie Beispieldaten zusammen mit der gewünschten Ausgabe und jeder Abfrage, die Sie ausprobiert haben. –

+2

Mögliches Duplikat von [Oracle-Abfrage, um alle Vorkommen eines Zeichens in einer Zeichenfolge zu finden] (http://stackoverflow.com/questions/17906105/oracle-query-to-find-all-occurences-of-a-charcter-in) -a-string) –

+0

Danke Dr. Avalanche, das war nützlich. Das einzige Problem, mit dem ich konfrontiert bin, ist, dass diese Instr-Funktionen auf großen Tischen eine schreckliche Leistung haben. – neo

Antwort

1

So etwas, um die Zeichenfolge in jedes Zeichen zu brechen und dann auf Ihren gewünschten Wert zu filtern?

-- data setup to create a single value to test 
WITH dat as (select 'ABCDEACDFA' val from DUAL) 
-- 
SELECT lvl, strchr 
from (
    -- query to break the string into individual characters, returning a row for each 
    SELECT level lvl, substr(dat.val,level,1) strchr 
    FROM dat 
    CONNECT BY level <= length(val) 
) WHERE strchr = 'A'; 

returns: 
LVL STRCHR 
1  A 
6  A 
10  A 
+0

Danke für die Veröffentlichung. Das einzige Problem ist die Leistung zu diesem Zeitpunkt. Ich renne auf einem riesigen Tisch. – neo

+1

benötigen Sie alle Positionen aller Instanzen Ihres Briefes in allen Zeilen? kann nicht helfen, ohne genaue Anforderungen abzustimmen ... –

+0

ja, alle Positionen von 'a'. Also könnte es eine oder mehrere Zeilen geben. – neo

0

Hier ist eine andere Methode mit einer weniger Auswahl und einem Regex. Ich glaube nicht, dass es Ihrem Leistungsproblem helfen wird. Bitte versuchen Sie es und lassen Sie es uns wissen:

SQL> with tbl(str) as (
    select 'Aabjggaklkjha' from dual 
    ) 
    select level as position 
    from tbl 
    where upper(REGEXP_SUBSTR(str, '.', 1, level)) = 'A' 
    connect by level <= length(str); 

    POSITION 
---------- 
     1 
     2 
     7 
     13 

SQL>