我需要以特定格式提取数据,而且我正在与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 ||' $')它有一种倾向从上面的' @'中可以看出,放下第一个角色。已从第一个电子邮件地址中删除。
任何人都可以就如何使其发挥作用提出任何建议吗?
非常感谢提前!
答案 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的答案,这使我认为发生的事情更加清晰。