2016-07-30 6 views
0

betrachten sei i unten DatenSplit die Säule und finden min, max und avg Wert in Oracle-Abfrage

Name  Fee 
Student1 Fee paid : 100rs 
Student2 Fee paid : 500rs 
Student3 Fee paid : 200rs 

Ich brauche max auszuwählen, min und avg Wert von Fee-Säule, die bis aufspalten müssen von: und rs Begrenzer

zum Beispiel hier Ergebnis ist

Min  Max  Avg 
100  500  250 
+0

Was hat die Spalte * Name mit dieser Frage zu tun? – trincot

+2

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

Antwort

2

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.

Verwandte Themen