Oracle ROWTOCOL功能怪异

时间:2016-12-22 10:18:07

标签: database oracle

我需要以特定格式提取数据,而且我正在与ROWTOCOL功能稍微挣扎,希望一双新眼睛能够提供帮助。

我使用的是10g Oracle DB(10.2),所以LISTAGG看起来像我需要做的事情不是一个选择。

我需要将一些用户名聚合成一个以' $'分隔的字符串。但我还需要连接另一列来建立电子邮件地址。

select
rowtocol('select username_id from username where user_id = '||s.user_id|| 'order by USERNAME_ID asc','@'||d.domain_name||'$') 
from username s, domain d
where s.user_id = d.user_id

(我已经简化了特定于此函数的查询,因为实际查询非常大,并且除了这个特定函数之外都可以工作。)

在DOMAIN表格中我有很多域名,例如' hotmail.com'' gmail.com'等

我需要连接用户名,' @'域后面跟着一个符号,所有符号都用' $'

分隔 ......等......

joe.bloggs@gmail.com$joeblogs@gmail.com$joe_bloggs@gmail.com 

我与此斗争过,但我已经接近但反过来了?!.....

gmail.com$joe.bloggs@gmail.com$joeblogs@gmail.com$joe_bloggs

我也注意到,如果我玩分隔符(' @' || d.domain_name ||' $')它有一种倾向从上面的' @'中可以看出,放下第一个角色。已从第一个电子邮件地址中删除。

任何人都可以就如何使其发挥作用提出任何建议吗?

非常感谢提前!

2 个答案:

答案 0 :(得分:1)

正如亚历克斯在评论中告诉你的那样,这个ROWTOCOL并不是一个标准功能,所以如果你不显示它的代码,我们无法做任何事情来解决它。

但是,您可以使用XMLAGG内置函数在Oracle 10中完成所需的工作。

试试这个:

SELECT 
    rtrim (xmlagg (xmlelement (e, s.user_id || '@' || d.domain_name || '$')).extract ('//text()'), '$') whatever
FROM username s
INNER JOIN domain d ON  s.user_id = d.user_id

答案 1 :(得分:1)

假设您正在使用the rowtocol function from OTN,并且表格中包含以下内容:

create table username (user_id number, username_id varchar2(20));
create table domain (user_id number, domain_name varchar2(20));

insert into username values (1, 'joe.bloggs');
insert into username values (1, 'joebloggs');
insert into username values (1, 'joe_bloggs');
insert into domain values (1, 'gmail.com');

然后您的原始查询返回三行:

gmail.com$joe.bloggs
gmail.com$joe_bloggs@gmail.com$joebloggs
gmail.com$joe_bloggs@gmail.com$joebloggs

您将每个用户ID的数据传递给rowtocol的单独调用,这实际上并不是您想要的。你可以通过扭转来获得我认为你所追求的结果;将连接两个表的主查询作为select参数传递给函数,并让传递的查询执行用户名/域串联 - 这是字符串聚合的单独步骤:

select
rowtocol('select s.username_id || ''@'' || d.domain_name from username s join domain d on d.user_id = s.user_id', '$')
from dual;

得到一个结果:

joe.bloggs@gmail.com$joe_bloggs@gmail.com$joebloggs@gmail.com

这是否适合您尚未显示的较大查询,这是一个单独的问题。您可能需要将其与查询的其余部分相关联。

在Oracle中还有其他方法可以将字符串聚合,但此功能是单向的,您已经安装了它。我会考虑其他替代方案,例如ThomasG的答案,这使我认为发生的事情更加清晰。