Есть ли эквивалент SQL Server функции ISNUMERIC() - является ли значение числом?
Есть код, который возвращает сообщение об ошибке, если значение невалидно. Хотелось бы вернуть сообщение об ошибке, если даннное значение не численное:
IF (option_id = 0021) THEN
IF ((value<10000) or (value>7200000) or /* Numeric Check */) THEN
ip_msg (6214, option_name); -- Error Message
return;
END IF;
END IF;
В SQL Server для этого просто пользуюсь ISNUMERIC(). Хотел бы делать нечто подобное:
IF ((!ISNUMERIC(value)) or (value<10000) or (value>7200000)) THEN ...
Свободный перевод How can you tell if a value is not numeric in Oracle? от участника @Kyle Williamson
Ответы (3 шт):
IF REGEXP_LIKE(value, '^-?\d+(\.\d+)?$') THEN ...
вернёт TRUE, если value содержит числовое значения.
Или в запросе:
SELECT column
FROM table
WHERE REGEXP_LIKE (column, '^-?\d+(\.\d+)?$');
Свободный перевод ответа от участника @Rob van Laarhoven и ответа от участника @Matt Byrne
Встроенной функции нет. Можно написать свою:
create or replace function isNumeric (str varchar2) return boolean is
begin
if to_number (str) = 0 then null; end if;
return true;
exception when value_error then return false;
end;
Затем вызывать её так:
IF (isNumeric (str) AND
to_number (str) >= 1000 AND
to_number (str) <= 7000)
Если версия не позднее 12.2, то есть расширение к стандартной функции to_number:
IF (to_number (str default null on conversion error) >= 1000 AND
to_number (str default null on conversion error) <= 7000 )
Свободный перевод ответа от участника @Justin Cave
Начиная 12с появилась функция VALIDATE_CONVERSION:
create or replace function isNumeric (value varchar2) return boolean is
begin
return (validate_conversion (value as number) = 1);
end;
/
var error varchar2
exec if not isNumeric ('123 56') then -
:error := 'invallid value'; end if;
print error
ERROR
--------------
invallid value
Также начиная с 12c в CAST возможно указать значение в случае ошибки конвертации:
create or replace function safeToNumber (value varchar2) return number is
begin
return cast (value as number default null on conversion error);
end;
/
Последнюю функцию можно использовать в SQL контексте:
SQL> select safeToNumber (trim (column_value)) num
from xmlTable ('"123","+2e3","-123.34"');
NUM
----------
123
2000
-123.34