Plsql 将具有长字符串的列拆分为每行1个字sql
关于stackoverflow,我也看到过类似的问题,但没有一个问题专门针对一列——我有一列,其中每行有多个单词。我设置了行,以便用#分隔单词。我现在需要它,以便对字符串进行解析,并且每行只有一个单词。以下是该列当前的外观(当前约1500行): 我希望它看起来像这样:Plsql 将具有长字符串的列拆分为每行1个字sql,plsql,oracle11g,Plsql,Oracle11g,关于stackoverflow,我也看到过类似的问题,但没有一个问题专门针对一列——我有一列,其中每行有多个单词。我设置了行,以便用#分隔单词。我现在需要它,以便对字符串进行解析,并且每行只有一个单词。以下是该列当前的外观(当前约1500行): 我希望它看起来像这样: TEST ------------------- SPOKE WITH MR SMITHS ASSISTANT MRS MOODY REFUSED A VISIT SCHEDULING OFFICE LEFT etc... etc
TEST
-------------------
SPOKE
WITH
MR
SMITHS
ASSISTANT
MRS
MOODY
REFUSED
A
VISIT
SCHEDULING
OFFICE
LEFT
etc... etc... etc...
-------------------
我对这种类型的查询比较陌生,所以您可以为我提供的任何教程或文档也会很有帮助。我正在使用TOAD和OracleSQL。谢谢。因为您是在Oracle
PL/SQL
领域,所以有一组有用的函数称为正则表达式。将分隔字符串拆分为较小的字符串符合REGEXP\u SUBSTR
函数的类别,如下例所示:
编辑:发现了一个疏忽:分隔序列中的最后一个数字被遗漏在输出之外。分隔符的数量比序列中的元素数量少1。。。循环次数已更新
查询演示
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正则表达式
应该会得到一些很好的web资源来记录可用的其他功能。非常详细,谢谢。。。我想我最困惑的是如何为每个单词创建新行,我没有意识到可以使用通用编程语法来创建逻辑。。。我得研究一下如何写这些类型的宏谢谢!我想我(作弊)了一点,因为你可能试图在SQL
编程语言的约束下解决这个问题。如果在纯SQL中完成,此代码段可能会更长一些。。。这仍然是可能的。。。乱七八糟的。由于您在ORACLE
环境中工作,因此有可能使用ORACLE对SQL的自定义扩展(即PL/SQL
),它允许对标准数据库查询语言功能使用过程逻辑和处理步骤。享受吧!
MRS
MOODY
REFUSED
A
SCHEDULING
OFFICE
LEFT
A
MESSAGE
FOR
LEFT
A
MESSAGE
FOR
SPOKE
WITH
MR
ETC... ETC... ETC...