この回答のような関数が提供する を使用して、数値以外の値を除外できます。 、または正規表現を使用-微調整が必要な場合があります:
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フィドル 。
ジャスティンの関数の方がおそらく安全ですが、それはほとんどの非数値を除外します(おそらくすべてですが、私はそれほど自信がありません-正規表現は強力な領域ではありません)。
ただし、キャスト前にフィルター機能が適用される保証はありません。それでも問題が発生する場合は、サブクエリを使用して数値以外の値を除外し、残っている値の実際の値を確認できます。ただし、Oracleがサブクエリのネストを解除して評価順序を変更するのを防ぐためのヒントを追加する必要があるでしょう。
別のアプローチは、実際の数を返すジャスティンの関数のバリエーションです:
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;
/
次に、クエリはそれを使用できます:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;
SQLフィドル 。