Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ungültige Zahlen

Sie könnten die nicht numerischen Werte mit einer Funktion wie diese Antwort bereitstellt herausfiltern , oder mit einem regulären Ausdruck - der möglicherweise etwas angepasst werden muss:

select count(1), result_num
from vitals
where test_cd = 'TEMP'
and regexp_like(result_num, '^[-]?[0-9]*[\.]?[0-9]*$')
and cast(result_num as integer) > 104
group by result_num;

SQL-Fiddle .

Das wird die meisten Nicht-Zahlen ausschließen (vielleicht alle, aber ich bin mir nicht so sicher - Regex ist kein starker Bereich), obwohl Justins Funktion wahrscheinlich sicherer ist.

Es gibt jedoch noch keine Garantie dafür, dass die Filterfunktion vor der Besetzung angewendet wird. Wenn dies immer noch fehlschlägt, können Sie eine Unterabfrage verwenden, um nicht numerische Werte herauszufiltern und dann den tatsächlichen Wert der verbleibenden zu überprüfen. aber Sie müssten wahrscheinlich einen Hinweis hinzufügen, um zu verhindern, dass Oracle die Unterabfrage entschachtelt und die Auswertungsreihenfolge für Sie ändert.

Ein anderer Ansatz ist eine Variation von Justins Funktion, die die tatsächliche Zahl zurückgibt:

CREATE OR REPLACE FUNCTION safe_number( p_str IN VARCHAR2 )
  RETURN NUMBER DETERMINISTIC PARALLEL_ENABLE
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN l_num;
EXCEPTION
  WHEN value_error THEN
    RETURN null;
END safe_number;
/

Dann kann Ihre Abfrage das verwenden:

select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;

SQL-Fiddle .