Пока общая длина комментария составляет менее 4000 символов, вы можете использовать listagg()
вставить куски вместе в одну строку (с использованием CTE вместо вашей реальной таблицы и изменение имени столбца и как последовательность и комментарии являются зарезервированными словами):
with t (seq, text) as (
select 1, 'COMPUTER 01777 6629378 FREE TEXT, THIS COMMENT IS' from dual
union all select 2, 'TELEPHONE I require to perform a query select * fro' from dual
union all select 3, 'm which leave me the column entitled " coment " in ' from dual
union all select 4, 'just 56 characters' from dual
)
select listagg(text, null) within group (order by seq)
from t;
FULL_TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COMPUTER 01777 6629378 FREE TEXT, THIS COMMENT ISTELEPHONE I require to perform a query select * from which leave me the column entitled " coment " in just 56 characters
и тогда вы можете использовать Connect-иерархического синтаксис с substr
рубить его обратно в нужной длину. Я предполагал, вы имели в виду 45, а не 56, как это вывод, который вы показали в вашем вопросе:
with t (seq, text) as (
select 1, 'COMPUTER 01777 6629378 FREE TEXT, THIS COMMENT IS' from dual
union all select 2, 'TELEPHONE I require to perform a query select * fro' from dual
union all select 3, 'm which leave me the column entitled " coment " in ' from dual
union all select 4, 'just 56 characters' from dual
),
y as (
select listagg(text, null) within group (order by seq) as full_text
from t
)
select level as seq, substr(full_text, 45 * (level - 1) + 1, 45) as text
from y
connect by level <= ceil(length(full_text)/45);
SEQ TEXT
---------- ---------------------------------------------
1 COMPUTER 01777 6629378 FREE TEXT, THIS COMM
2 ENT ISTELEPHONE I require to perform a query
3 select * from which leave me the column entit
4 led " coment " in just 56 characters
В вашем реальном случае Вы, вероятно, есть много отдельных замечаний, с некоторым общим значением ключа; поэтому ключ 1 имеет 1-4, второй 2 имеет 1-3, и т. д. Вы все равно можете использовать этот метод, но вам нужно использовать трюк, чтобы остановить циклическое соединение. Я установил это с фиктивной таблицей называется comments
, содержащий два отдельных значения:
select * from comments order by fk_id, seq;
FK_ID SEQ TEXT
---------- ---------- ---------------------------------------------------
7 1 COMPUTER 01777 6629378 FREE TEXT, THIS COMMENT IS
7 2 TELEPHONE I require to perform a query select * fro
7 3 m which leave me the column entitled " coment " in
7 4 just 56 characters
11 1 A second comment for a different foreign key value
11 2 to demonstrate combining and splitting when there a
11 3 re multiple records
Тогда ваш запрос к этой таблице становится:
with cte as (
select fk_id, listagg(text, null) within group (order by seq) as full_text
from comments
group by fk_id
)
select fk_id, level as seq, substr(full_text, 45 * (level - 1) + 1, 45) as text
from cte
connect by level <= ceil(length(full_text)/45)
and prior fk_id = fk_id
and prior sys_guid() is not null;
FK_ID SEQ TEXT
---------- ---------- ---------------------------------------------
7 1 COMPUTER 01777 6629378 FREE TEXT, THIS COMM
7 2 ENT ISTELEPHONE I require to perform a query
7 3 select * from which leave me the column entit
7 4 led " coment " in just 56 characters
11 1 A second comment for a different foreign key
11 2 value to demonstrate combining and splitting
11 3 when there are multiple records
SQL Fiddle demo.
можно изменить схему? в ur create command укажите varchar (limit) –