2012-04-04 6 views
1

Ich habe den folgenden regulären Ausdruck:SQL zurückzukehren Ergebnisse der folgenden regex

WHERE A.srvc_call_id = '40750564' AND REGEXP_LIKE (A.SRVC_CALL_DN, '[^TEST]') 

Die Zeile, die 40.750.564 enthält, hat „TEST CALL“ in der Spalte SRVC_CALL_DN und REGEXP_LIKE nicht, es Filterung zu sein scheinen aus . Wenn ich die Abfrage ausführe, wird die Zeile zurückgegeben, wenn dies nicht der Fall ist.

Ist mein Regex-Muster falsch? Oder akzeptiert SQL keine [^whatever]?

Antwort

2

Das Karat verankert den Ausdruck an den Anfang einer Zeichenfolge. Indem Sie die Buchstaben T, E, S & T in eckigen Klammern eingeben, suchen Sie barsju suggests für beliebig dieser Zeichen, nicht für die Zeichenfolge TEST.

Sie sagen, dass SRVC_CALL_DNenthält die Zeichenfolge 'TEST CALL', aber Sie sagen nicht im String, wo. Sie sagen auch, dass Sie suchen, wo diese Zeichenfolge nicht übereinstimmen. Dies bedeutet, dass Sie not regexp_like(...

Wenn man all dies zusammen Ich glaube, Sie müssen verwenden möchten:

AND NOT REGEXP_LIKE (A.SRVC_CALL_DN, '^TEST[[:space:]]CALL') 

Diese schließt jedes Spiel aus der Abfrage, wo die Zeichenfolge beginnt mit'TEST CALL'. Wenn diese Zeichenfolge jedoch an einer beliebigen Position in der Spalte sein kann, müssen Sie das Karat entfernen - ^.

Dies setzt auch voraus, dass die Zeichenfolge immer in Großbuchstaben ist. Wenn es in Groß- oder Kleinbuchstaben ist, müssen Sie es erneut ändern. Etwas wie folgt aus:

AND NOT REGEXP_LIKE (upper(A.SRVC_CALL_DN), '^TEST[[:space:]]CALL') 

Durch oberen Gehäuse SRV_CALL_DN Sie sicherstellen, dass Sie gehen zu immer passen, aber dafür sorgen, dass Ihre Abfrage keinen Index auf dieser Spalte verwenden. Ich würde mir über diesen speziellen Punkt keine Sorgen machen, da Abfragen für reguläre Ausdrücke bei der Verwendung von Indizes ohnehin ziemlich schlecht sein können und es so aussieht, als sei SRVC_CALL_ID indexiert.

Auch wenn es kann nicht enthalten 'CALL' müssen Sie dies entfernen. Am besten verwenden Sie reguläre Ausdrücke, um Ihr Übereinstimmungsmuster so explizit wie möglich zu machen. Also: 'CALL' wenn du kannst.

+0

Ah. Das klingt richtig .. Ich dachte, er würde^als Anfang der Zeile verwenden .. – barsju

+0

Meine Absicht war, irgendwelche Zeilen mit "Test" in SRVC_CALL_DN auszuschließen. Ich habe Ihren Vorschlag mit NON REGEXP_LIKE verwendet, was funktioniert hat! Vielen Dank ! – Kyle

1

Versuchen mit '^TEST' oder '^TEST.*'

Ihr regexp bedeutet eine beliebige Zeichenfolge mit keinem der Charaktere beginnen: T, E, S, T.

Aber Ihr Fall ist so einfach, beginnt mit TEST. Warum nicht ein einfaches wie:

LIKE 'TEST%' 
+0

+1 Ich war so konzentriert auf die Regexes, die ich nicht in Betracht gezogen habe! – Ben

Verwandte Themen