2016-12-28 3 views
0

Ich behalte Daten in Tabellenzeilen wie folgt;Oracle Regulärer Ausdruck anstelle der INSTR-Funktion

t_course

+------+------------------------------------------+ 
| sid | courses         | 
+------+------------------------------------------+ 
| 1 | cs101.math102.ns202-2.phy104   | 
+------+------------------------------------------+ 
| 2 | cs101.math201.ens202-1.phy104-10.chm105 | 
+------+------------------------------------------+ 
| 3 | cs101.ns202-2.math201.ens202-1.phy104 | 
+------+------------------------------------------+ 

Jetzt möchte ich die Summe nehmen von Kursen NS202 und ens202 in der gleichen Zeit erwähnt. Normalerweise sollte es nur Datensatz bringen, die ID ist 3, es bringt alle Datensätze (wegen Instr). Ich habe viele Methoden dafür verwendet, aber es funktioniert nicht. Beispielsweise;

select count(*) from 
    t_course 
     where 
      instr(courses, 'ns202') > 0 
     and instr(courses, 'ens202') > 0; 

Above Code funktioniert nicht richtig, weil es NS202 nimmt aber ens202 enthält NS202 in sich.

Ich versuchte mit regulären Ausdrücken, ich konvertierte alle Kurs in Zeile (Split), aber das hat sowohl Arbeitslogik gebrochen und verlangsamt.

Wie kann ich dies mit regulären Ausdrücken anstelle von Instr entsprechend beginnen mit (zum Beispiel ns202%) Logik? (Beginnt mit ns202, zuerst oder nach dem Punkt)

+0

wollen Sie Zeilen, die sowohl 'ns202' als auch' ens202' haben? –

+0

@vkp, Ja, ich möchte nur die Summe der Datensätze, die sowohl ns202 und ens202 enthält. –

+0

Was meinst du mit * Summe der Datensätze * hier? –

Antwort

2

Sie können mit Wortgrenzen verwenden, um Zeilen zu erhalten, die sowohl ns202 als auch ens_202 enthalten. Normalerweise würden Sie \b für Wortgrenzen verwenden. Wie Oracle es nicht unterstützt, ist die Alternative (\s|\W) mit Start ^ und Ende $ Anker zu verwenden.

\s - Leerzeichen, \W - kein Wortzeichen. Fügen Sie bei Bedarf weitere Zeichen als Wortgrenzen basierend auf Ihren Anforderungen hinzu.

select * 
from t_course 
where regexp_like(courses,'(^|\s|\W)ns202(\s|\W|$)') 
and regexp_like(courses,'(^|\s|\W)ens202(\s|\W|$)') 
+0

vielen Dank für Ihre Hilfe. –

1

Sie das gleiche Problem mit ens202 haben, übrigens - was, wenn es auch cens202 oder tens202?

Sie können Ihr Problem mit regulären Ausdrücken lösen. Sie können auch mit dem LIKE-Operator lösen:

select <whatever> 
from <table or tables> 
where (courses like 'ns202%' or courses like '%.ns202%') 
    and (courses like 'ens202%' or courses like '%.ens202%') 

Sie beiden Ansätze testen, um zu sehen, was am besten für Ihre Daten arbeitet.