2016-10-05 6 views
3

ComNoフィールドを含めるように求められました。コメントのフィールド長が5文字を超える場合は、コメントの残りの文字が次の行に表示され、ComNoフィールドは1つのフィールドの長さがnより大きい場合の自動インクリメントカウンタ

入力

EmpID EmpName ServiceNumber Date   Comments 
1  a  123   23-03-1990 wednesday 
1  a  1234   24-04-1990 Test12 
2  b  234   24-05-2016 Todayis 

と予想される出力は、私は、この使用してPLSQLプロシージャを実装する方法のアイデアを持っている

EmpID EmpName ServiceNumber Date  ComNo Comments 
1  a  123   23-03-1990 1  wedne 
1  a  123   23-03-1990 2  sday 
1  a  1234   24-04-1990 1  Test1 
1  a  1234   24-04-1990 2  2 
2  b  234   24-05-2016 1  Today 
2  b  234   24-05-2016 2  is 

あるだけ増分しますしかし、我々はSQLクエリを使用して同じを実装することはできますか?

答えて

2

ここでは、コメントの長さに関する事前の前提がない解決法があります。私は解決策を完全にテストするために、行が失われていないことを確認するために、短い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データ型である場合、それはsubstrdbms_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 
; 
+0

ありがとうございます:)それは動作します –

0

ブルートフォースオプションでは、一度に5文字のコメントを分割から生じただけでUNION一緒に記録に次のようになります。ここでは

SELECT EmpID, EmpName, ServiceNumber, Date, 1, SUBSTR(Comments, 1, 5) AS Comments 
FROM yourTable 
UNION ALL 
SELECT EmpID, EmpName, ServiceNumber, Date, 2, SUBSTR(Comments, 6, 5) AS Comments 
FROM yourTable 
WHERE SUBSTR(Comments, 6, 5) <> '' -- but don't show a record if 
UNION ALL       -- all characters already used 
... 
+0

@AnnieJeba次に、ゴードンの答えを見てください。ところで、なぜこれを行う必要がありますか? –

+0

http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions181.htm#SQLRF06114 – mathguy

+0

@mathguyなぜOPはPostgresを使用していたと思いましたか? –

0

は、これを行うための一つの方法です:

with n as (
     select 1 as n from dual union all 
     select 2 from dual 
    ) 
select EmpID, EmpName, ServiceNumber, Date, ComNo, 
     substr(comments, n.n * 5 - 4, 5) as Comments 
from t join 
    n 
    on length(comments) >= n.n * 5 + 1; 

注:あなたの例はコメントが10文字までしかないので、nには値1と2だけが必要です。 nを展開して追加の行を作成できます。

+0

こんにちはゴードン、あなたの返事をありがとう。私の例は10文字までのコメントしか持っていませんが、実際のデータは4000文字以上のコメントを持っています。 –

+0

@AnnieJeba。 。 。このソリューションは、そのような場合に備えて簡単に拡張できます。しかし、私はOracleが文字列を4000文字に制限していることに注意しています。したがって、文字列が長すぎると驚くでしょう。 –

+0

@GordonLinoff - OracleのCLOBデータ型のドキュメント:https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype。htm#i3237 – mathguy

関連する問題