求sql语句 大家好:有一个字符串 1-5/3/9/11/22求sql语句如何通过-取得1.2.3.4.5通过3.9.11.22 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1-5/3/9/11/22 如何通过sql语句把/分开查询得到 1-5,3,9,11,22 问题不是很大只是处理的字符串复杂了一些。1:"1-5" 可以考虑用INSTR和SUBSTR函数取出数字1和5,然后再用CONNECT BY或者ALL_OBJECTS这种方式凑出1,2,3,4,5这种方式的值。2:"/3/9/11/22" 直接用REPLACE函数把'/'换成','便可。用存储过程处理会好一些。 给楼主一个函数能够实现其功能CREATE OR REPLACE FUNCTION get_stop_divider(p_str VARCHAR2) RETURN VARCHAR2AS l_str1 VARCHAR2(100); --保存1-5 l_str2 VARCHAR2(100); --保存1.2.3.4.5 l_str VARCHAR2(200); --保存1.2.3.4.5.3.9.11.22 l_start INT; l_end INT;BEGIN l_str1 := regexp_substr(p_str,'[[:digit:]]-[[:digit:]]'); --取得1-5 l_start := TO_NUMBER(regexp_substr(l_str1,'^[[:digit:]]')); --取得1 l_end := TO_NUMBER(regexp_substr(l_str1,'[[:digit:]]$')); --取得5 FOR i IN l_start .. l_end LOOP --从1-5拼成1.2.3.4.5 IF l_str2 IS NULL THEN l_str2 := TO_CHAR(i); ELSE l_str2 := l_str2 || '.' || TO_CHAR(i); END IF; END LOOP; l_str := regexp_replace(p_str,'[[:digit:]]-[[:digit:]]',l_str2); --变为1.2.3.4.5/3/9/11/22 l_str := replace(l_str,'/','.'); --变为1.2.3.4.5.3.9.11.22 RETURN l_str;END;/select get_stop_divider('1-5/3/9/11/22') from dual; 是的,但是如果用WMSYS.WM_CONCAT函数又会复杂一些而且增加了处理负担。所以用存储过程和函数会更好一些,zcs_1的函数处理方式已经可以完全实现。但是可能需要考虑具体的一些特殊情况细节,这个需要LZ判断了。 oracle 全量备份报错 orcale中 表名是变量 如何让oracle 支持日文检索? 请问哪位高手知道 oracle 调用java类的效率问题 oracle监听无法启动 如何修改sid?我原来起的名字不好,可否后来在修改? 数据库中多个表是否可以共用一个触发器???? 看看这个怎么写update? 我装的oralce8i怎么没有监听? 存储过程中临时表或者视图的问题。 急求一个sql语句,表信息在正文中 想问一个sqlldr的问题。文件第一行是字段名。load的时候怎么去掉。
查询得到 1-5,3,9,11,22
用存储过程处理会好一些。
CREATE OR REPLACE FUNCTION get_stop_divider(p_str VARCHAR2)
RETURN VARCHAR2
AS
l_str1 VARCHAR2(100); --保存1-5
l_str2 VARCHAR2(100); --保存1.2.3.4.5
l_str VARCHAR2(200); --保存1.2.3.4.5.3.9.11.22
l_start INT;
l_end INT;
BEGIN
l_str1 := regexp_substr(p_str,'[[:digit:]]-[[:digit:]]'); --取得1-5
l_start := TO_NUMBER(regexp_substr(l_str1,'^[[:digit:]]')); --取得1
l_end := TO_NUMBER(regexp_substr(l_str1,'[[:digit:]]$')); --取得5
FOR i IN l_start .. l_end LOOP --从1-5拼成1.2.3.4.5
IF l_str2 IS NULL THEN
l_str2 := TO_CHAR(i);
ELSE
l_str2 := l_str2 || '.' || TO_CHAR(i);
END IF;
END LOOP;
l_str := regexp_replace(p_str,'[[:digit:]]-[[:digit:]]',l_str2); --变为1.2.3.4.5/3/9/11/22
l_str := replace(l_str,'/','.'); --变为1.2.3.4.5.3.9.11.22
RETURN l_str;
END;
/select get_stop_divider('1-5/3/9/11/22') from dual;
所以用存储过程和函数会更好一些,zcs_1的函数处理方式已经可以完全实现。但是可能需要考虑具体的一些特殊情况细节,这个需要LZ判断了。