如何在oracle中连接两个查询中的两个字符串?

时间:2018-01-05 18:56:20

标签: oracle concatenation

我不认为这与子查询有关。但我有点不清楚如何搜索这个问题。

我想连接两个查询结果,一个是来自一个表,另一个是来自b表。我认为这是一个简单的查询,但我有点忘了它。

select id, value as a_value from a where id = 1 and sub_id = 1;
select id, value as b_value from b where id = 1 and sub_id = 2;

最终,我想获得a_value || b_value(两个值的聚合),我怎么能实现这个呢?

我的想法是

select aa.a_value || bb.b_value  (
(select id, value from a where id = 1 and sub_id = 1) aa,
(select id, value from a where id = 1 and sub_id = 2) bb
)

看来绝对错了。你能帮到这个吗?

我的问题是我想为每个查询提供一些参考,在上面的查询中,aa和bb是我想要获得的参考。 实际上,我想要实现的真实查询有点复杂。

select aa.a_value || bb.b_value (
(select id, to_clob(value) as a_value  from a where id = 1 and sub_id = 1) aa,
(select id, listagg(value, '') as b_value within group (order by sub_id) from a where id = 1 and sub_id >=2 group by id) bb);

我想这样做的原因是在聚合之后,我遇到'ORA-01489:字符串连接的结果太长'。其中一个解决方案可以是上面的查询。所以,我想做那个查询。

Oracle版本信息是 Oracle Database 12c企业版12.1.0.2.0版 - 64位生产

这是一个例子 表格有以下记录。

id  sub_id  value
1   1   a .... a (1000 char)
1   2   b .... b (1000 char)
1   3   c .... c (1000 char)
1   4   d .... d (1000 char)
1   5   e .... e (1000 char)

我想要创建的字符串是 a .... ab .... bc .... cd .... de .... e,属于id = 1的整个字符串的聚合。 为了做到这一点,我可以使用listagg但listadd函数的返回类型是varchar2。在聚合之后,返回的字符串变为5,000个字符,因此它返回错误'ORA-01489:字符串连接的结果太长',因为varchar2限制为4,000个字符。为了解决这个问题,我不得不使用TO_CLOB函数将第一个字符串'a .... a'转换为clob类型然后我聚合其余的字符串('b .... b','c .. ...... c','d .... d','e .... e')进入那个clob,a .... a。为了做到这一点,我想为它创建查询。

1 个答案:

答案 0 :(得分:1)

始终声明您的数据库版本 - 完整版本号,由select * from v$version返回(例如,我的是12.1.0.2.0)。

为什么重要?例如,在这种情况下,您可以使用listagg()函数 - 但仅限于您的版本是11.2或更高版本(不是11.1!)

select   id, listagg(value) within group (order by sub_id) as value_list
from     a
where    id = 1 and sub_id in (1, 2)
group by id -- not needed in this case; needed if you do it for more than one id

当然,简单的连接在几乎任何环境中都没有意义;您可能希望用空格或逗号分隔“值” - 您可以通过向listagg()提供第二个参数(可选)来实现。