web-dev-qa-db-de.com

Nummer aus String mit Oracle-Funktion extrahieren

Ich muss eine Oracle DB-Funktion erstellen, die eine Zeichenfolge als Parameter verwendet. Die Zeichenfolge enthält Buchstaben und Zahlen. Ich muss alle Zahlen aus dieser Zeichenfolge extrahieren. Wenn ich beispielsweise eine Zeichenfolge wie RO1234 habe, muss ich eine Funktion verwenden können, beispielsweise extract_number('RO1234'). Das Ergebnis wäre 1234

Genauer gesagt ist dies die Art von SQL-Abfrage, in der diese Funktion verwendet werden würde.

SELECT DISTINCT column_name, extract_number(column_name) 
FROM table_name
WHERE extract_number(column_name) = 1234;

FRAGE: Wie füge ich meiner Oracle-Datenbank eine solche Funktion hinzu, um sie wie im obigen Beispiel verwenden zu können, indem Sie eine Oracle SQL Developer- oder SQLTools-Clientanwendung verwenden?

6
Vali S

Sie würden REGEXP_REPLACE verwenden, um alle nicht-stelligen Zeichen aus einer Zeichenfolge zu entfernen:

select regexp_replace(column_name, '[^0-9]', '')
from mytable;

oder

select regexp_replace(column_name, '[^[:digit:]]', '')
from mytable;

Natürlich können Sie eine Funktion extract_number schreiben. Es scheint ein bisschen übertrieben zu sein, eine Funktion zu schreiben, die nur aus einem Funktionsaufruf besteht.

create function extract_number(in_number varchar2) return varchar2 is
begin
  return regexp_replace(in_number, '[^[:digit:]]', '');
end; 
31

Sie können reguläre Ausdrücke verwenden, um die Zahl aus dem String zu extrahieren. Lass es uns überprüfen. Angenommen, dies ist der String, der aus Text und Zahlen "stack12345overflow569" besteht. Das sollte funktionieren:

select regexp_replace('stack12345overflow569', '[[:alpha:]]|_') as numbers from dual;

das wird "12345569" zurückgeben.

sie können auch dieses verwenden:

select regexp_replace('stack12345overflow569', '[^0-9]', '') as numbers,
       regexp_replace('Stack12345OverFlow569', '[^a-z and ^A-Z]', '') as characters
from dual

das gibt "12345569" für Zahlen und "StackOverFlow" für Zeichen zurück.

4
Parasram Pawar

Wenn Sie nach der 1. Zahl mit Dezimalzahl suchen, da der String die richtigen Dezimalstellen hat, können Sie die Funktion regexp_substr wie folgt versuchen:

regexp_substr('stack12.345overflow', '\.*[[:digit:]]+\.*[[:digit:]]*')
0
Iqbal Singh