我有一个在where子句中使用REGEXP_LIKE函数的SQL,现在我需要将在Oracle8i中运行的该函数的等价物。
正则表达式如下所示:
where REGEXP_LIKE(parm, '^[PMF][[:digit:]]+[_].*')提前谢谢。
发布于 2011-05-11 12:32:46
你可以试一试
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-11 12:50:01
在谷歌上搜索一下,似乎有一个名为OWA_PATTERN的包,早在8i就可以使用了。它提供了大量的正则表达式支持。它显然是PL/SQL Web Toolkit安装的一部分。它可能在您的8i安装中可用,也可能不可用。请与数据库管理员联系以获取数据库。
引用它的Here is a 9i document。
发布于 2011-05-11 12:14:49
不幸的是,在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;https://stackoverflow.com/questions/5958958
复制相似问题