2015-04-20 2 views
-1

Мне нужно выполнить запрос select * from, который оставляет мне столбец под названием «coment» всего 56 символов, результирующие символы должны будут конкатенировать следующую строку, соответствующую числу последовательность. Я понятия не имею, как это сделать, любое предложение приветствуется.Как ограничить количество символов в столбце oracle,

это моя исходная таблица:

SEQUENCE COMMENT 
_____________________________________________________________ 
|  1|COMPUTER 01777 6629378 FREE TEXT, THIS COMMENT IS 
|  2|TELEPHONE|I require to perform a query select * fro 
|  3|m which leave me the column entitled " coment " in 
|  4|just 56 characters   
______________________________________________________ 

Это ожидаемый результат.

SEQUENCE COMMENT 
______________________________________________________ 
|  1|COMPUTER 01777 6629378 FREE TEXT, THIS COMM 
|  2|ENT IS TELEPHONE I require to perform a query 
|  3|select * from which l|eave me the column enti 
|  4|tled " coment " in just 56 characters  
______________________________________________________ 
+0

можно изменить схему? в ur create command укажите varchar (limit) –

ответ

2

Пока общая длина комментария составляет менее 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.

+0

Я так благодарен за то, что поделился своими знаниями –

+0

немного сомневаюсь в том, что у вас есть таблица с 10 000 записей, необходимо будет переписать часть объединения команд, выбрав 10000 раз для все записи? –

+0

@CesarVictorino - нет, объединение всех в первом CTE (общее табличное выражение) предназначено только для создания фиктивных данных для этой демонстрации. Вы бы выбрали из своего собственного реального стола, а не моего 't' CTE. –