Как вы можете определить, является ли значение не числовым в Oracle?
у меня есть следующий код, который возвращает сообщение об ошибке, если мое значение является недопустимым. Я хотел бы дать то же сообщение об ошибке, если заданное значение не является числовым.
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()
. Я хотел бы сделать что-то подобное в Oracle. Например,
IF((!ISNUMERIC(value)) or (value<10000) or (value>7200000))
THEN ...
5 ответов
нет встроенной функции. Вы могли бы написать один
CREATE FUNCTION is_numeric( p_str IN VARCHAR2 )
RETURN NUMBER
IS
l_num NUMBER;
BEGIN
l_num := to_number( p_str );
RETURN 1;
EXCEPTION
WHEN value_error
THEN
RETURN 0;
END;
и/или
CREATE FUNCTION my_to_number( p_str IN VARCHAR2 )
RETURN NUMBER
IS
l_num NUMBER;
BEGIN
l_num := to_number( p_str );
RETURN l_num;
EXCEPTION
WHEN value_error
THEN
RETURN NULL;
END;
вы можете сделать
IF( is_numeric( str ) = 1 AND
my_to_number( str ) >= 1000 AND
my_to_number( str ) <= 7000 )
REGEXP_LIKE(column, '^[[:digit:]]+$')
возвращает true, если столбец содержит только числовые символы
С Oracle DB 12c Release 2
можно использовать VALIDATE_CONVERSION функция:
VALIDATE_CONVERSION определяет, можно ли преобразовать expr в указанный тип данных. Если expr можно успешно преобразовать, то эта функция возвращает 1; в противном случае эта функция возвращает 0. Если значение expr равно null, то эта функция возвращает значение 1. Если при оценке expr возникает ошибка, эта функция возвращает ошибку.
IF (VALIDATE_CONVERSION(value AS NUMBER) = 1) THEN
...
END IF;
вы можете использовать следующее регулярное выражение, которое будет соответствовать целые числа (например, 123
), числа с плавающей точкой (12.3
), и числа с экспонентами (1.2e3
):
^-?\d*\.?\d+([eE]-?\d+)?$
если вы хотите принять +
знаки, а также -
знаки (как Oracle делает с TO_NUMBER()
), вы можете изменить каждое вхождение -
выше [+-]
. Таким образом, вы можете переписать свой блок кода выше следующим образом:
IF (option_id = 0021) THEN
IF NOT REGEXP_LIKE(value, '^[+-]?\d*\.?\d+([eE][+-]?\d+)?$') OR TO_NUMBER(value) < 10000 OR TO_NUMBER(value) > 7200000 THEN
ip_msg(6214,option_name);
RETURN;
END IF;
END IF;
я не совсем уверен, что справлюсь со всеми значения, поэтому вы можете добавить EXCEPTION
блокировать или написать пользовательский to_number()
функция, как предлагает @JustinCave.
лучший ответ, который я нашел в интернете:
SELECT case when trim(TRANSLATE(col1, '0123456789-,.', ' ')) is null
then 'numeric'
else 'alpha'
end
FROM tab1;