我有一个在 where 子句中使用 REGEXP_LIKE 函数的 SQL,现在我需要在 Oracle 8i 中运行的等效函数。
正则表达式如下所示:
where REGEXP_LIKE(parm, '^[PMF][[:digit:]]+[_].*')
提前致谢。
你可以试试
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 也不受支持(或者至少它们处于“降级,请停止使用它们”的支持级别)。
在谷歌搜索中,似乎有一个名为 OWA_PATTERN 的包可以追溯到 8i。它提供了相当多的正则表达式支持。它显然是 PL/SQL Web Toolkit 安装的一部分。它可能在您的 8i 安装中可用,也可能不可用。请与 DBA 联系以获取数据库。
这是引用它的 9i 文档。
不幸的是,在 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;