Sie einen regulären Ausdruck dafür verwenden könnte:
select min(fee_num), max(fee_num), avg(fee_num)
from (
select to_number(regexp_substr(fee, ':\s*(\d+)\s*rs', 1, 1, null, 1)) fee_num
from mytable
)
Das 6 th Argument von regexp_substr
(verfügbar seit Oracle 11g) ermöglicht es Ihnen, nur den Text von der Capture-Gruppe angepasst zurückzukehren (d \d+
in diesem Fall).
Der reguläre Ausdruck erfordert ein :
gegebenenfalls mit white-space gefolgt werden (\s*
), dann einig Ziffer zu haben (s) (\d+
), wiederum gefolgt von optionalem weißen Raum, mit rs
, dass nach.
Beachten Sie, dass das Abrufen von Beträgen aus Textspalten jeglichen Vorteil aus einer strukturierten Datenbank zunichte macht: Indizes für diese Spalte werden nicht verwendet, und die Extraktion mit regulären Ausdrücken verursacht einen Overhead.
Im normalisierten relationalen Datenbankentwurf enthält ein Feld nur atomare Daten, sonst nichts. In diesem Fall sollte die Spalte fee
nur die Menge enthalten und einen numerischen Datentyp haben. Alle weiteren Informationen, die Sie über die Gebühr wissen müssen, sollten in verschiedenen Spalten gespeichert werden.
Was hat die Spalte * Name mit dieser Frage zu tun? – trincot
In Zukunft sollten Sie solche Daten nicht wirklich speichern. Speichern Sie numerische Daten in einer eigenen numerischen Spalte. Einen String-Split zu machen, um aus einer Spalte einen aussagekräftigen Wert zu erhalten, ist keine gute Design-Entscheidung. – Kritner