暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将列中的逗号分隔值转换为行,并将结果集与另一个表连接

askTom 2018-08-27
977

问题描述

我有一张下面的表

R_ID R_Site R_Name R_Role
-
1 123,-456,-789 qwer所有者
2 56,-741-852 qaz经理
3 369,-741,-987 wsx员工
4所有eddc员工
5名所有rfv员工

并使用下面的查询将R_Site逗号分隔的值转换为行

选择REGEXP_SUBSTR (txt,'[^,]',1,级别) 作为站点,R_NAME
从 (选择不同的R_SITE作为txt,从MY_TABLE中选择R_NAME
按级别连接 <= 长度 (regexp_replace(txt,'[^,] *')) 1

现在,我需要将上述结果集连接到R_SITE(SITE) = S_SITE上的下表,以在最终结果中获取S_Sal值

S_ID s_s_s_mgr
----- ------ -----
1 -789 10000 Raghu
2 -123 20000马赫什
3 -456 300000 Swetha
4 -147 400000 Vamsi
5所有500000纳伦德拉

但是当我加入时,数据库一直在旋转,没有给出任何结果。

您能否让我知道我是否在任何步骤中做错了,以及纠正它的方法。

SQL更新:
---------
源表
创建表MY_TABLE (
R_ID int,
R_Site varchar(255),
R_Name varchar(255),
角色varchar(255)
);

插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','123,-456,-789 ','qwer','Owner');

插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','56,-741,-852 ','qaz','Manager');

将逗号分隔的字符串拆分为行后,我希望得到如下表所示的结果

创建表MY_TABLE (
R_ID int,
R_Site varchar(255),
R_Name varchar(255),
角色varchar(255)
);

插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 (“1” 、 “123” 、 “qwer” 、“ 所有者 ”);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','-456,','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','-789','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','56','qaz','Manager');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','-741','qaz','Manager');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','-852','qaz','Manager');

我能够通过使用常规exp并按级别连接来有效地实现这一目标。但是我想在ASCI标准中有一个解决方案。

提前谢谢。





专家解答

感谢您将其放入SQL中,以便我们可以使用它。

即使您将版本设置为 “18”,我也将假定这是SQL开发人员版本,因此这里可以在11g中使用。如果您对逗号数的计算错误,则通常会产生旋转查询,因此最终将永远 “连接”。我们可以使用cast/multisset来获取每行 * 的逗号数,以避免这种情况

SQL> CREATE TABLE MY_TABLE(
  2  R_ID int,
  3  R_Site varchar(20),
  4  R_Name varchar(20),
  5  R_Role varchar(20)
  6  );

Table created.

SQL>
SQL> INSERT INTO MY_TABLE(R_ID , R_Site , R_Name , R_Role )
  2  VALUES ('1' , '123,-456,-789', 'qwer' , 'Owner');

1 row created.

SQL>
SQL> INSERT INTO MY_TABLE(R_ID , R_Site , R_Name , R_Role )
  2  VALUES ('2' , '56,-741,-852', 'qaz' , 'Manager');

1 row created.

SQL>
SQL>
SQL> select
  2    t.r_id,
  3    t.r_name,
  4    t.r_role,
  5    regexp_substr(t.R_Site, '[^,]+', 1, commas.column_value)  as site
  6  from
  7    MY_TABLE t,
  8    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.R_Site, '[^,]+'))  + 1) as sys.OdciNumberList)) commas
  9  order by 1,2,3,4;

      R_ID R_NAME                                                       R_ROLE                                                       SITE
---------- ------------------------------------------------------------ ------------------------------------------------------------ --------------------
         1 qwer                                                         Owner                                                        -456
         1 qwer                                                         Owner                                                        -789
         1 qwer                                                         Owner                                                        123
         2 qaz                                                          Manager                                                      -741
         2 qaz                                                          Manager                                                      -852
         2 qaz                                                          Manager                                                      56

6 rows selected.


从那时起,该结果集就像任何其他表一样,因此,如果您想与其他表连接,wave子句将使其保持简单,即

with my_Results as 
(
select
  t.r_id,
  t.r_name,
  t.r_role,
  regexp_substr(t.R_Site, '[^,]+', 1, commas.column_value)  as site
from
  MY_TABLE t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.R_Site, '[^,]+'))  + 1) as sys.OdciNumberList)) commas
)
select ...
from   my_results,
       [other table]
where ...



我不确定不是ANSI标准是什么意思-如果您的意思是不想使用CONNECT,那么还有其他方法。这是一个不错的摘要:

https://lalitkumarb.wordpress.com/2015/03/04/split-comma-delimited-strings-in-a-table-in-oracle/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论