我有一个在where子句中使用REGEXP_LIKE函数的SQL,现在我需要等效于将在Oracle 8i中运行的函数。
正则表达式如下:
where REGEXP_LIKE(parm, '^[PMF][[:digit:]]+[_].*')
提前致谢。
答案 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核实数据库。
答案 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;