Oracle:Oracle 8i中REGEXP_LIKE函数的替代方案

时间:2011-05-11 03:39:00

标签: sql regex oracle oracle8i

我有一个在where子句中使用REGEXP_LIKE函数的SQL,现在我需要等效于将在Oracle 8i中运行的函数。

正则表达式如下:

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

提前致谢。

3 个答案:

答案 0 :(得分:6)

你可以尝试

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也没有支持(或者至少它们处于'退化,请停止使用它们'的支持水平)。

答案 1 :(得分:3)

在谷歌搜索中,似乎有一个名为OWA_PATTERN的包可以回到8i。它提供了相当多的正则表达式支持。它显然是PL / SQL Web Toolkit安装的一部分。它可能在您的8i安装中提供,也可能不提供。请与DBA核实数据库。

Here is a 9i document引用它。

答案 2 :(得分:2)

不幸的是,在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;