大家好:
有一个字符串 1-5/3/9/11/22求sql语句如何
通过-取得1.2.3.4.5
通过3.9.11.22 谢谢

解决方案 »

  1.   

    1-5/3/9/11/22  如何通过sql语句把/分开
    查询得到 1-5,3,9,11,22
      

  2.   

    问题不是很大只是处理的字符串复杂了一些。1:"1-5" 可以考虑用INSTR和SUBSTR函数取出数字1和5,然后再用CONNECT BY或者ALL_OBJECTS这种方式凑出1,2,3,4,5这种方式的值。2:"/3/9/11/22" 直接用REPLACE函数把'/'换成','便可。
    用存储过程处理会好一些。
      

  3.   

    给楼主一个函数能够实现其功能
    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;
      

  4.   

    是的,但是如果用WMSYS.WM_CONCAT函数又会复杂一些而且增加了处理负担。
    所以用存储过程和函数会更好一些,zcs_1的函数处理方式已经可以完全实现。但是可能需要考虑具体的一些特殊情况细节,这个需要LZ判断了。