ここでは、コメントの長さに関する事前の前提がない解決法があります。私は解決策を完全にテストするために、行が失われていないことを確認するために、短い2文字(5文字以下)と10文字以上の2つの文字列を追加しました。
(empid, dt)
は、基本表のユニークな組み合わせ(おそらく主キー)であると仮定します。ところで、あなたのスキーマで実際にDate
を列名として使用していないことを願っています。
解決策にWITH句が含まれていません。 select empid...
から始まります。ORDER BY句は必要ない場合もあります。
with
test_data (empid, empname, servicenumber, dt, comments) as (
select 1, 'a', 123, to_date('23-03-1990', 'dd-mm-yyyy'), 'wednesday' from dual union all
select 1, 'a', 1234, to_date('24-04-1990', 'dd-mm-yyyy'), 'Test12' from dual union all
select 2, 'b', 234, to_date('24-05-2016', 'dd-mm-yyyy'), 'Todayis' from dual union all
select 2, 'b', 235, to_date('25-05-2016', 'dd-mm-yyyy'), 'Joe' from dual union all
select 3, 'c', 238, to_date('25-05-2016', 'dd-mm-yyyy'), '' from dual union all
select 4, 'c', 2238, to_date('25-05-2016', 'dd-mm-yyyy'), 'longer string' from dual
)
select empid, empname, servicenumber, dt, level as comno,
substr(comments, 5 * level - 4, 5) as comments
from test_data
connect by level <= 1 + length(comments)/5
and prior empid = empid
and prior dt = dt
and prior sys_guid() is not null
order by empid, dt
;
EMPID E SERVICENUMBER DT COMNO COMMENTS
---------- - ------------- ---------- ---------- --------------------
1 a 123 1990-03-23 1 wedne
1 a 123 1990-03-23 2 sday
1 a 1234 1990-04-24 1 Test1
1 a 1234 1990-04-24 2 2
2 b 234 2016-05-24 1 Today
2 b 234 2016-05-24 2 is
2 b 235 2016-05-25 1 Joe
3 c 238 2016-05-25 1
4 c 2238 2016-05-25 1 longe
4 c 2238 2016-05-25 2 r str
4 c 2238 2016-05-25 3 ing
追加:あなたのデータはCLOBデータ型である場合、それはsubstr
のdbms_lob
バージョンを使用することをお勧めします。また、データを75文字のセグメントに分割する必要がある場合は、複数の数値を調整する必要があります。これらの2つの変更があってもORDER BY句がない場合でも同じ解決策があります(これを使用して別のdb製品にデータを移行する場合は不要です)。注:dbms_lob.substr()
は、通常のsubstr()
関数と比較して、「量」と「オフセット」(2番目と3番目の引数)を逆にしています。解決策を比較するときに注意してください。
select empid, empname, servicenumber, dt, level as comno,
dbms_lob.substr(comments, 75, 75 * level - 74) as comments
from test_data
connect by level <= 1 + length(comments)/75
and prior empid = empid
and prior dt = dt
and prior sys_guid() is not null
;
ありがとうございます:)それは動作します –