Plsql 将具有长字符串的列拆分为每行1个字sql

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

关于stackoverflow,我也看到过类似的问题,但没有一个问题专门针对一列——我有一列,其中每行有多个单词。我设置了行,以便用#分隔单词。我现在需要它,以便对字符串进行解析,并且每行只有一个单词。以下是该列当前的外观(当前约1500行):

我希望它看起来像这样:

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...