Plsql分割字符串的最佳方法

时间:2015-12-10 17:51:35

标签: sql oracle plsql

从字符串中提取单词的最佳方法是什么? 我已经做了一些事情,因为我找到了许多方法,但没有一个看起来很简单。

我们假设有一个名为'change_opening_hours'的程序。此过程有一个名为“v_perioden”的时间范围字符串输入。

此字符串如下所示:

'10:00-12:00'

'10:00-12:00 14:00-16:00'

'10:00-12:00 14:00-16:00 18:00-22:00'

现在我已经自己做了一些事情来从这个输入中抽出每一段时间。

  v_perioden   VARCHAR2(50) := '10:00-12:00 14:00-18:00 22:00-24:00';
  ...
  -- loop though time-periode depeningd
  -- on amount of spaces
  FOR i IN 0..REGEXP_COUNT(v_perioden, ' ') LOOP
    -- first period
    IF i = 0 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 0, 11));
    -- second period
    ELSIF i = 1 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 13, 11));
    --thirt period
    ELSIF i = 2 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 25, 11));
    END IF;
  END LOOP;

输出:

10:00-12:00
14:00-18:00
22:00-24:00

现在这种方式工作正常,但它不具备能力。我试图找出如何从一个空格中的字符串中提取单词,但这并没有成功。

3 个答案:

答案 0 :(得分:6)

此方法处理NULL元素(尝试使用此字符串'10:00-12:00 18:00-22:00'进行测试,在不需要编辑的情况下处理分隔符出现之间的可变字符数,最重要的是处理列表中可变数量的元素:

SQL> with tbl(v_perioden) as (
      select '10:00-12:00 14:00-16:00 18:00-22:00'  from dual
    )
    select level nbr, regexp_substr(v_perioden, '(.*?)( |$)', 1, level, null, 1) element
    from tbl
    connect by level <= regexp_count(v_perioden, ' ')+1
    order by level;

       NBR ELEMENT
---------- -----------------------------------
         1 10:00-12:00
         2 14:00-16:00
         3 18:00-22:00

SQL>

这就是为什么你要确保你处理NULL列表元素:Split comma separated values to columns in Oracle

总是期待意外!

答案 1 :(得分:2)

您应该使用SUBSTR和INSTR Function

的组合
select  substr('A B C',0,instr('A B C',' ')) from dual  -- A
UNION ALL
select substr( 'A B C',instr('A B C',' ') , instr('A B C',' ',1,2)-1  ) from dual --B
UNION ALL
select substr( 'A B C', instr('A B C',' ',1,2) , instr('A B C',' ') ) from dual  -- C

*用字符串替换A B C

答案 2 :(得分:0)

如果您要求 create or replace PROCEDURE insertDATE( DATE_PARAM IN VARCHAR2, ) IS BEGIN INSERT INTO CUSTOMER("DATE") VALUES (TO_TIMESTAMP(DATE_PARAM,'DD-MM-YYYY HH:MI:SS AM')); COMMIT; END; 这样做,您可能希望在本地工具箱中开发自己的内置功能。您可以使用以下内容:创建一个函数,该函数将从分隔的(任何分隔符)输入字符串返回一个集合:

plsql

然后处理你的收藏......

  • CREATE OR REPLACE TYPE t_list AS TABLE OF VARCHAR2(100); CREATE OR REPLACE FUNCTION seplist_to_coll(p_sep in Varchar2, p_list IN VARCHAR2) RETURN t_list AS l_str VARCHAR2(32767) := p_list || p_sep ; l_sep_idx PLS_INTEGER ; l_idx PLS_INTEGER := 1 ; l_tab t_list := t_list() ; BEGIN LOOP l_sep_idx := INSTR(l_str, p_sep, l_idx); EXIT WHEN l_sep_idx = 0; l_tab.EXTEND; l_tab(l_tab.COUNT) := TRIM(SUBSTR(l_str, l_idx, l_sep_idx - l_idx)); l_idx := l_sep_idx + 1; END LOOP; RETURN l_tab; END seplist_to_coll; / 中使用SQL函数使用它:它创建了一个可以在table()子句中使用的表:

    IN(..)
select * from table(seplist_to_coll(' ', '10:00-12:00 14:00-16:00 18:00-22:00'))
  • 它可以处理空值

    COLUMN_VALUE
    10:00-12:00
    14:00-16:00
    18:00-22:00
    
select rownum, '<'||column_value||'>' from table(seplist_to_coll(' ', '  x  s'));