Oracle: альтернатива функции REGEXP_LIKE в Oracle 8i - PullRequest
2 голосов
/ 11 мая 2011

У меня есть SQL, который использует функцию REGEXP_LIKE в предложении where, теперь мне нужен эквивалент этой функции, которая будет работать в Oracle 8i.

Регулярное выражение выглядит так:

where REGEXP_LIKE(parm, '^[PMF][[:digit:]]+[_].*')

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 11 мая 2011

Вы можете попробовать

WHERE SUBSTR(parm,1,1) IN ('P','M','F')
AND substr(parm,2,1) between '0' and '9'
AND substr(ltrim(substr(parm,2),'0123456789'),1,1) = '_'

Первый символ - P, M или F. Второй символ - это цифра Второй символ вперед, убирая все цифры слева, должен начинаться с подчеркивания

PS. Пожалуйста, снимите вашу 8i базу данных. Мало того, что 8i не поддерживается, 9i и 10g также не поддерживаются (или, по крайней мере, они находятся на уровне поддержки «деградировал, пожалуйста, прекратите их использовать»).

3 голосов
/ 11 мая 2011

При поиске, кажется, есть пакет с именем OWA_PATTERN, который был доступен еще до 8i. Это обеспечило довольно много поддержки регулярных выражений. Очевидно, это была часть установки PL / SQL Web Toolkit. Он может или не может быть доступен в вашей установке 8i. Обратитесь к администратору базы данных для базы данных.

Вот документ 9i , который ссылается на него.

2 голосов
/ 11 мая 2011

К сожалению, до REGEXP_LIKE все было довольно мрачно.Мы должны были сделать это вручную, под проливным дождем, в обе стороны.Что-то вроде этого, вероятно, необходимо:

WHERE SUBSTR(parm,1,1) IN ('P','M','F')
AND digits_followed_by_underscore(SUBSTR(parm,2)) = 'Y'

Используя следующую процедуру (предупреждение: поспешно взломан, не проверен):

CREATE PROCEDURE digits_followed_by_underscore(v IN VARCHAR2)
  RETURN VARCHAR2 IS
  digit_found VARCHAR2(1) := 'N';
BEGIN
  IF LENGTH(v) = 0 THEN
    RETURN 'N';
  END IF;
  FOR i IN 1..LENGTH(v) LOOP
    IF SUBSTR(v,i,1) BETWEEN '0' AND '9' THEN
      digit_found := 'Y';
    ELSIF SUBSTR(v,i,1) = '_' THEN
      RETURN digit_found;
    ELSE
      RETURN 'N';
    END IF;
  END LOOP;
  RETURN 'N';
END;
...