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

Posted

技术标签:

【中文标题】Oracle:Oracle 8i 中 REGEXP_LIKE 函数的替代方案【英文标题】:Oracle : Alternative of REGEXP_LIKE function in Oracle 8i 【发布时间】:2011-05-11 03:38:59 【问题描述】:

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

正则表达式如下所示:

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

提前致谢。

【问题讨论】:

【参考方案1】:

你可以试试

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

【讨论】:

【参考方案2】:

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

Here is a 9i document 引用它。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Oracle:Oracle 8i 中 REGEXP_LIKE 函数的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败

如何将 SQL 开发人员/Toad 连接到 Oracle 8i

从 Dual 中选择时是不是可以指定 Oracle 8i 伪列的数据类型

多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案

作业可执行 Oracle 8i

Oracle 8i SQL 命令未正确结束