sql >> データベース >  >> RDS >> Oracle

無効な番号

    この回答のような関数が提供する を使用して、数値以外の値を除外できます。 、または正規表現を使用-微調整が必​​要な場合があります:

    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フィドル



    1. C#.netコードからSQLストアドプロシージャにnull変数を渡す方法

    2. ページを介してmysql接続を開いたままにしておくのは完全に無謀ですか?

    3. ActiveRecordを使用したyii2の複雑なデータベースクエリ

    4. 都市の列ごとに従業員の名前を配置する必要があります