Mustereinschränkung in sqlplus (Oracle 9i)

Hallo,

ich habe das folgende Problem:
Eine Spezifikation sieht vor, dass in einer Spalte Einträge der folgenden Form stehen sollten:
Länge=4 oder 5 Zeichen,
Beginnt mit A-Z,
Rest A-Z oder 0-9

Leider enthält die Datenbank auch andere Einträge.
Nun benötige ich ein SQL-Statement, welches mir „ungewollte“ Einträge anzeigt.
In mysql wäre das ja mit regexp flott erledigt, aber wie geht es in Oracle 9i sqlplus, ohne tausend „and/or/not“ Bedingungen?

Dankeschön,
Michael

Auch hallo.

Länge=4 oder 5 Zeichen,
Beginnt mit A-Z,
Rest A-Z oder 0-9

Leider enthält die Datenbank auch andere Einträge.
Nun benötige ich ein SQL-Statement, welches mir „ungewollte“
Einträge anzeigt.

Ein Versuch (Autor dieser Zeilen kennt nur Oracle 8i und 10g):
SELECT * FROM
WHERE ??> NOT MATCHES [0…9] AND NOT MATCHES [A…Z]

Evtl. auch mit LIKE, ORDER BY,…

Nachtrag: reg. Ausdrücke gibt es in Oracle 10g: http://www.trivadis.ch/Images/regexp_doag_tcm16-1213…
(Quelle: plsql.de @ like)

HTH
mfg M.L.

Hallo, Markus.

Ein Versuch (Autor dieser Zeilen kennt nur Oracle 8i und 10g):
SELECT * FROM
WHERE ??> NOT MATCHES [0…9] AND NOT MATCHES [A…Z]

Wie komme ich damit an ein gezieltes Zeichen im Eintrag, bzw. an die Länge des Eintrags ran, naja und hauptsächlich wie verhindere ich dass ich das für jedes einzelne Zeichen machen muss. Gar nicht, oder?

Nachtrag: reg. Ausdrücke gibt es in Oracle 10g:

Gut zu wissen aber das hilft mir aber leider akut nicht, weil ich auf 10g keinen Zugriff habe, was sich auch die nächsten Monate nicht ändern dürfte.

Gruss,
Michael

Hallo nochmal.

Wie komme ich damit an ein gezieltes Zeichen im Eintrag, bzw.
an die Länge des Eintrags ran, naja und hauptsächlich wie
verhindere ich dass ich das für jedes einzelne Zeichen machen
muss. Gar nicht, oder?

Stimmt, denn: MATCHES gilt nur für Informix. Bleibt nur noch LIKE übrig.

Nachtrag: reg. Ausdrücke gibt es in Oracle 10g:

Gut zu wissen aber das hilft mir aber leider akut nicht, weil
ich auf 10g keinen Zugriff habe, was sich auch die nächsten
Monate nicht ändern dürfte.

Also die Oracle 10g XE lässt sich unter Windows 2K und besser mit Adminrechten hervorragend installieren :smile: Die gezeigte pdf-Datei verwendet auch den ‚amatch‘-Befehl.

mfg M.L. (war beim ersten Posting etwas zerstreut…)

Mahlzeit,

ich habe das folgende Problem:
Eine Spezifikation sieht vor, dass in einer Spalte Einträge
der folgenden Form stehen sollten:
Länge=4 oder 5 Zeichen,
Beginnt mit A-Z,
Rest A-Z oder 0-9

Hmmm… Eventuell könntest du das mit einer PL/SQL-Funktion erledigen.
Ich versuchs mal:

CREATE OR REPLACE FUNCTION Check\_String (sCheck IN VARCHAR2) RETURN VARCHAR2 AS
 vRet VARCHAR2;
 nLength NUMBER;
 i NUMBER;
 c CHAR(1);
 a NUMBER;
BEGIN
 nLength := NVL(LENGTH (sCheck), 0);
 IF (nLength 5) THEN
 vRet := 'LENGTH';
 RETURN vRET;
 END IF;
 ' Test ob erstes Zeichen A-Z
 IF ASCII(sCheck) 90 THEN
 vRet := 'LENGTH';
 RETURN vRet;
 END IF;
 ' Restliche Zeichen auf A-Z bzw. 0-9 testen
 FOR i IN( 2..nLength) LOOP
 c := SUBSTR(sCheck, i, 1);
 a := ASCII(c);
 IF (a \>= 48 AND a = 65 AND a Dann kannst du die fehlerhaften Eintragungen einfach selektieren:

    SELECT Spalte
     FROM Tabelle
     WHERE Check\_String(Spalte) 'OK';


Sicher nicht optimal, aber eine mögliche Lösung. Achtung, Code ist nicht ausprobiert!

Gruß

Sancho

Mahlzeit,

Um 9 Uhr abends? Na dann prost Mahlzeit :smile:

Hmmm… Eventuell könntest du das mit einer PL/SQL-Funktion erledigen.

Danke für den Hinweis mit PL/SQL, so weit hatte ich im Moment gar nicht gedacht. Zusammen mit Markus’ Vorschlägen zu „owa_pattern.amatch“ kann ich mir nen Schuh draus reinem und bin nun hoffentlich der Lösung ein ganzes Stück näher.

Ich denke mal, owa_pattern.match in einer Funktion die den Inhalt erstmal auf Länge testet wie Du es vorgemacht hast, damit sollte das Problem relativ leicht zu erschlagen sein (bilde ich mir jetzt erstmal ein, wird die Realität dann zeigen).

Dankeschön,
Michael

Grüsse,

Also die Oracle 10g XE lässt sich unter Windows 2K und besser
mit Adminrechten hervorragend installieren :smile: Die gezeigte
pdf-Datei verwendet auch den ‚amatch‘-Befehl.

Ich hatte es mir gestern schon mal durchgelesen, war aber etwas skeptisch. Heute morgen habe ich mir mal die Dokus zu owa_pattern reingezogen und ja, der Hinweis war wertvoll. Geht damit, die im Dokument beschriebene schlechte Performance ist ein Manko, das ich in Kauf nehmen kann, denn x-tausend Einträge von Hand prüfen dauert noch länger :smile:

Oracle 10g ist aber komplett außer Frage, weil ich nicht in einer Position bin, in der ich das entscheiden könnte.
So muss ich halt 9i-Nachteile in Kauf nehmen die ich mit 10g nicht hätte :frowning:

Frohes Pfingsten,
Michael