Mustervergleich mit Like-Klausel
Ich bin versucht, verwenden Sie eine LIKE-Klausel in einer SQL-Anweisung entsprechen einem bestimmten Muster innerhalb von Oracle.
Ich würde gerne etwas tun, als solche:
LIKE '[A-Z][A-Z][1-4]%'
..aber ich kann nicht einen regex verwenden, denn dies ist auf Oracle9i (regex Unterstützung kam 10g).
Ich bin versucht zu entsprechen, etwas, das zwei Zeichen vor, dann eine Zahl zwischen 1 und 4 und, dass alles, was darüber hinausgeht. Ich habe versucht, aber es scheint nicht zu funktionieren. Der einzige Weg, ich in der Lage gewesen, um es zu arbeiten ist, indem Sie:
WHERE ...
LIKE '%1__' OR
LIKE '%2__' OR
LIKE '%3__' OR
LIKE '%4__'
Ich bin nicht sicher, ob das so, wie ich möchte, es zu tun möglich ist, oder der richtige Weg, wie ich habe nie versucht Muster mit der LIKE-Klausel.
Jede Hilfe Sie ihm geben könnte wäre sehr dankbar.
InformationsquelleAutor | 2009-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
Wenn Sie möchten, auch passend niedrigeren Buchstaben, dann gilt die Obere () - Funktion, um die 2 ersten substr():
zB. where upper(substr(c1,1,1)) in ...
Leistung
Getestet habe ich die Performance der Abfrage mit regexp_like und ohne. Wie Sie sehen können die Abfrage ohne Funktion regexp_like war 100% schneller.
(Anm. Beide Abfragen haben ein soft-parse)
Zweite Methode
Holen Sie sich die ascii-Werte von A,Z,1 und 4
Jetzt können Sie schreiben Sie Ihre Erklärung viel kürzer
Tun Sie einfach, WO substr(c1,1,1) zwischen 'A' und 'Z' ... statt, wo ascii(substr(c1,1,1)) ZWISCHEN 65 UND 90 .
Ich hoffe, dass nicht der Umfang der Vergleichsprüfungen. Einige der Einsparungen könnten sich auch aus der Tatsache Ihrer Zeilen in den Speicher aus der ersten Abfrage. Ebenfalls funktioniert das ASCII-trick die Arbeit mit multibyte-Zeichensätzen? Ich weiß es nicht, Frage nur.
InformationsquelleAutor Thomas Aregger
Klobig, aber vielleicht:
kann für Ihre Bedürfnisse....
EDIT: Eingebaut xlnt Vorschlag von @Hobo zu übersetzen, die den Teilstring, anstatt den substring der string übersetzt...
+1. Obwohl, wenn <blablabla> ist lang, würden Sie besser tun, übersetzen(substr(<blablabla>,1,3), 'ABC...', 'AAA...')? Ich gehe davon aus, dass übersetzen billiger ist, auf eine kürzere Zeichenfolge, und die Zeit, um das substring wäre in beiden Fällen gleich.
Guter Punkt...........
InformationsquelleAutor DCookie
Empfehle ich INSTR:
Das problem bei der Verwendung einer wildcard in ein WIE die ist, es gibt keine Kontrolle darüber, wo in der Spalte Wert den 1/2/3/4/etc verwandeln wird - es könnte am Ende sein.
DCookie Recht ist - diese Antwort nicht haben eine Art des Umgangs, wenn es die numerischen Daten in diesem Ort. Aber es ist immer noch besser als mit LIKE mit Platzhaltern.
InformationsquelleAutor OMG Ponies
Total wild-Karte, aber zu empfehlen ist es trotzdem.
Macht Ihr 9i-Datenbank-installation haben, die PL/SQL Web Toolkit installiert? Der Grund für die Nachfrage ist, dass unsere Kunden darauf hin, dass es begrenzte Unterstützung für reguläre Ausdrücke mit einem der mitgelieferten Pakete, die mit ihm kommt.
Das Paket heißt owa_pattern und die einzige 9i link, den ich finden konnte ist diese ein
Habe ich nie benutzt und bin immer noch versuchen in den Griff zu bekommen, die mit Regulären Ausdrücken, so kann dir nicht sagen, ob es passen würde Ihrem Zweck, dachte aber, dass es von nutzen sein kann.
InformationsquelleAutor Ian Carpenter
Wenn Sie wirklich wollen, zu verwenden, reg exps entwickeln Sie eine java stored proc und eine begleitende pl/sql-wrapper. (Ich gehe davon aus, dass die Java-Version unterstützt Oracle 9 unterstützt die reg exps, ich bin mir nicht 100% sicher). Sie können call, java stored proc, die über die pl/sql-wrapper in Ihrer select-Anweisung.
Aber einfacher und schneller:
Variante zürigschnäzlets 's-Lösung ohne Nutzung der ascci-Funktion.
InformationsquelleAutor tuinstoel
Ich denke, dass Sie verwenden möchten REGEXP_LIKE statt wie.
WHERE REGEXP_LIKE(Feldname, '[A-Z]{2}[1-4]?.+','i');
Ja, das würde ich einfach verwenden REGEXP_LIKE, aber als rexem erwähnt, keine Unterstützung der pre-10g.
Rollen Sie Ihre eigenen REGEXP_LIKE, nehme ich an...
Anscheinend kann ich nicht Lesen...ich habe nicht finden Sie in der Oracle-version in der post, wenn ich es zum ersten mal gelesen. Sorry.
Die version war nicht zugegen, als Sie beantwortet. Nur müssen vorsichtig sein, über Antworten, wenn relevante Informationen nicht sofort verfügbar ist.
InformationsquelleAutor CaffGeek