从字符串中提取单词的最佳方法是什么? 我已经做了一些事情,因为我找到了许多方法,但没有一个看起来很简单。
我们假设有一个名为'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
现在这种方式工作正常,但它不具备能力。我试图找出如何从一个空格中的字符串中提取单词,但这并没有成功。
答案 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'));