2016-10-27 4 views
0

I eine Tabelle mit einer Spalte "Beschreibung" haben, welche die folgenden Werte hat:Oracle: to_number() mit substr kombiniert() und REGEXP_LIKE() in WHERE-Klausel

  • OPTestMachine
  • OPManualTesting
  • OP1010

So die select-Anweisung, um die Werte zu erhalten, wäre nur

SELECT description 
    FROM operation; 

Ich möchte die Zahl "1010" (oder eine beliebige Zeichenfolge, die dem substr() -Kriterium entspricht) extrahieren und die "gefundene Zeichenfolge" in eine ganze Zahl umwandeln, wenn möglich.

So kam ich mit auf den Punkt:

SELECT to_number(substr(description, 3, 4)) 
    FROM operation 
WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '') 

Das Ergebnis ist schlicht und einfach: "1010"

Das ist für mich ziemlich gut funktioniert.

Jetzt der schwierige Teil für mich: Ich möchte die substr() verwenden - Ergebnis in der WHERE-Klausel

Etwas wie folgt aus:

SELECT to_number(substr(description, 3, 4)) 
    FROM operation 
    WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '') 
    AND substr(description, 3, 4) < 2000; 

Als ich das bekomme ich die Fehlermeldung " Ungültige Nummer". Ich denke, es liegt an der Reihenfolge, wie der Server die Select-Anweisung analysiert.

Wenn Sie jede Hilfe zur Verfügung stellen könnten, wäre das großartig!

Antwort

2

Die substr Funktion gibt einen String, und Sie müssen explizit werfen es an die Nummer, wie Sie in der select-Anweisung hat: AND to_number(substr(description, 3, 4)) < 2000;

+0

Es tut mir leid, aber ich habe bereits versucht, und es gibt das gleiche zurück Fehler "Ungültige Nummer" – rwur

+2

Meine Ahnung hier ist, dass die Sub string gibt etwas anderes als eine Zahl zurück und verursacht einen Absturz. Versuchen Sie es zu trimmen, falls es auf Leerzeichen stößt: 'AND to_number (ltrim (rtrim (substr (Beschreibung, 3, 4)))) <2000;' – Sebz

+0

yeah, Sie haben Recht! Die zweite Lösung mit Trim funktioniert! – rwur

0
SELECT to_number(substr(description, 3, 4)) 
    FROM operation 
    WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '') 
    AND to_number(substr(description, 3, 4)) < 2000; 

Hilft zweite to_number?

wenn ich nicht tun würde:

select to_number(x) from (
SELECT substr(description, 3, 4) x 
     FROM operation 
     WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '')) 
     WHERE to_number(x) < 2000; 
+0

Es tut mir leid , aber ich habe das bereits versucht und es gibt den gleichen Fehler "Ungültige Nummer – rwur

+0

@rwur zweite Abfrage auch? In diesem Fall, was ist Ihr Dezimaltrennzeichen? – Kacper