проверить, есть ли в Oracle функция «это число» - PullRequest
35 голосов
/ 22 февраля 2011

Я пытаюсь проверить, является ли значение из столбца в запросе оракула (10g) числом, чтобы сравнить его.Что-то вроде:

select case when ( is_number(myTable.id) and (myTable.id >0) ) 
            then 'Is a number greater than 0' 
            else 'it is not a number' 
       end as valuetype  
  from table myTable

Есть идеи, как это проверить?

Ответы [ 16 ]

0 голосов
/ 10 января 2019

Вы можете использовать этот пример

SELECT NVL((SELECT 1 FROM  DUAL WHERE   REGEXP_LIKE (:VALOR,'^[[:digit:]]+$')),0) FROM DUAL;
0 голосов
/ 21 декабря 2015

если условие равно нулю, то это число

IF(rtrim(P_COD_LEGACY, '0123456789') IS NULL) THEN
                return 1;
          ELSE
                return 0;
          END IF;
0 голосов
/ 10 октября 2014

Обратите внимание, что регулярные выражения или подходы к функциям в несколько раз медленнее, чем простое условие sql .

Так что некоторые эвристические обходные пути с ограниченной применимостью имеют смысл для огромных сканирований.

Там решение для случаев, когда вы точно знаете, что нечисловые значения будут содержать буквенные буквы:

select case when upper(dummy)=lower(dummy) then '~numeric' else '~alpabetic' end from dual

И если вы знаете, что какая-то буква всегда будет присутствовать в нечисловомпадежи:

select case when instr(dummy, 'X')>0 then '~alpabetic' else '~numeric' end from dual

Когда числовые падежи всегда будут содержать ноль:

select case when instr(dummy, '0')=0 then '~alpabetic' else '~numeric' end from dual
0 голосов
/ 24 апреля 2014

Я считаю, что следующее решение (основанное на подходе regexp_like выше) является оптимальным:

function isInteger(vYourValue IN varchar2)
         return varchar2
         is
begin
  return case REGEXP_INSTR(vYourValue,'^[[:digit:]]+$') when 0 then 'F' else 'T' end;
end;

Почему я так говорю?

  1. Проверенное числовое подмножество может быть изменено по желанию путем соответствующего изменения регулярного выражения.

  2. Может использоваться в SQL, т.е. выбрать isInteger (myCol) из mytable; поскольку он возвращает 'T' вместо 'F' вместо логического значения.

  3. Он может быть использован изначально в pl / sql т.е. если isInteger (vMyValue) = 'T', то ....

  4. Он удовлетворяет утверждению чистоты WNDS, WNPS.

  5. Он не опирается, на мой взгляд, на слишком широкий спектр "когда другие" подходят для определения результата.

0 голосов
/ 30 ноября 2012

Функция для номера мобильного телефона длиной 10 цифр и начиная с 9,8,7 с использованием регулярного выражения

create or replace FUNCTION VALIDATE_MOBILE_NUMBER
(   
   "MOBILE_NUMBER" IN varchar2
)
RETURN varchar2
IS
  v_result varchar2(10);

BEGIN
    CASE
    WHEN length(MOBILE_NUMBER) = 10 
    AND MOBILE_NUMBER IS NOT NULL
    AND REGEXP_LIKE(MOBILE_NUMBER, '^[0-9]+$')
    AND MOBILE_NUMBER Like '9%' OR MOBILE_NUMBER Like '8%' OR MOBILE_NUMBER Like '7%'
    then 
    v_result := 'valid';
    RETURN v_result;
      else 
      v_result := 'invalid';
       RETURN v_result;
       end case;
    END;
0 голосов
/ 22 февраля 2011

ну, вы можете создать функцию is_number для вызова, чтобы ваш код работал.

create or replace function is_number(param varchar2) return boolean
 as
   ret number;
 begin
    ret := to_number(param);
    return true;
 exception
    when others then return false;
 end;

РЕДАКТИРОВАТЬ: Пожалуйста, отложите до ответа Джастина. Забыл эту маленькую деталь для чистого вызова SQL ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...