Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Nieprawidłowe numery

Możesz odfiltrować wartości nieliczbowe za pomocą funkcji takiej jak ta odpowiedź lub za pomocą wyrażenia regularnego — co może wymagać pewnych poprawek:

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;

Skrzypce SQL .

To wykluczy większość liczb niebędących liczbami (może wszystkie, ale nie jestem tak pewny siebie - wyrażenie regularne nie jest silnym obszarem), chociaż funkcja Justina jest prawdopodobnie bezpieczniejsza.

Jednak nadal nie ma gwarancji, że funkcja filtrowania zostanie zastosowana przed rzutowaniem. Jeśli to nadal się pojawia, możesz użyć podzapytania, aby odfiltrować wartości nienumeryczne, a następnie sprawdzić rzeczywistą wartość tych, które pozostały; ale prawdopodobnie będziesz musiał dodać wskazówkę, aby powstrzymać Oracle przed rozgnieżdżaniem podzapytania i zmianą kolejności oceny.

Innym podejściem jest odmiana funkcji Justina, która zwraca rzeczywistą liczbę:

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;
/

Wtedy Twoje zapytanie może użyć tego:

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

Skrzypce SQL .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle, dodawanie wiodących zer do łańcucha (nie liczby)

  2. Konstruktor ORACLE FORMS

  3. Jak zweryfikować datę RRRRMMDD podaną jako parametr PL/SQL?

  4. Przestrzeń nazw System.Data.OracleClient została wycofana?

  5. Jak zwrócić uniksową sygnaturę czasową w Oracle?