我已经看到了关于stackoverflow的类似问题,但没有一个只用1列专门处理---我有一个列,其中每行有多个单词。我设置行,以便用#分隔单词。我现在想要它以便解析字符串并且每行只有一个字。这是列当前的样子(当前大约1500行):
TEST
---------------------------------------------
SPOKE#WITH#MR#SMITHS#ASSISTANT
MRS#MOODY#REFUSED#A#VISIT
SCHEDULING#OFFICE#LEFT#A#MESSAGE#FOR#VISIT
LEFT#A#MESSAGE#FOR#VISIT
SCHEDULING#OFFICE#SCHEDULED#AN#APPOINTMENT#FOR#DR#JOHNSON
PHONE#CALL
---------------------------------------------
我希望它看起来像这样:
TEST
-------------------
SPOKE
WITH
MR
SMITHS
ASSISTANT
MRS
MOODY
REFUSED
A
VISIT
SCHEDULING
OFFICE
LEFT
etc... etc... etc...
-------------------
我对这种类型的查询比较陌生,所以你可以指出的任何教程或文档也会有所帮助。我正在使用TOAD和OracleSQL。谢谢。
答案 0 :(得分:2)
由于您处于Oracle PL/SQL
领域,因此有一组有用的函数称为REGULAR EXPRESSIONS
。将分隔的字符串拆分为较小的字符串符合REGEXP_SUBSTR
函数的类别,如以下示例所示:
编辑:发现疏忽:分隔系列中的最后一个数字不在输出中。分隔符的数量比系列中的元素数少1 ...
LOOP
次迭代次数已更新。
查询演示
DECLARE
x varchar2(100);
y pls_integer;
z pls_integer;
c VARCHAR2(40) := '1:3:4:6:8:10:3:4:7:6:11:12';
BEGIN
y := length(c) - length(replace(c,':'));
if y > 0 then
for z in 1 .. (y+1) loop
x := REGEXP_SUBSTR(c,'[^:]+', 1, z);
dbms_output.put_line(x);
end loop;
x :- REGEXP_SUBSTR(c,'[
end if;
end;
输出:
1
3
4
6
8
10
3
4
7
6
11
Statement processed.
0.01 seconds
使用OP的示例
DECLARE
cursor str_cursor is
select string_val
from test_split_string;
x varchar2(100);
y pls_integer;
z pls_integer;
BEGIN
for n in str_cursor loop
y := length(n.string_val) - length(replace(n.string_val,'#'));
for z in 1 .. (y+1) loop
x := REGEXP_SUBSTR(n.string_val,'[^#]+', 1, z);
dbms_output.put_line(x);
end loop;
end loop;
end;
示例2的结果
MRS
MOODY
REFUSED
A
SCHEDULING
OFFICE
LEFT
A
MESSAGE
FOR
LEFT
A
MESSAGE
FOR
SPOKE
WITH
MR
ETC... ETC... ETC...
对术语ORACLE REGULAR EXPRESSIONS
的搜索应该会产生一些良好的网络资源,以记录可用的其他功能。