2

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

正则表达式如下所示:

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

提前致谢。

4

3 回答 3

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 也不受支持(或者至少它们处于“降级,请停止使用它们”的支持级别)。

于 2011-05-11T04:32:46.043 回答
3

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

这是引用它的 9i 文档。

于 2011-05-11T04:50:00.580 回答
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;
于 2011-05-11T04:14:48.767 回答