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 伪列的数据类型