3

私が持っているものはこちら

クエリ

with temp as (
select 11 as x  from dual
union
select 222 as x  from dual
)
select x from temp t,(SELECT 1
          FROM DUAL 
         CONNECT BY ROWNUM <= 3)

出力

X
--
11
222
11
222
11
222

私が望む出力

X
--
11
11
222    
222
222

基本的に、列「X」値の長さに基づいて行を繰り返したいと思います。したがって、値が「abc」の場合、その行は 3 回繰り返す必要があります

4

3 に答える 3

6

これは機能します:

with temp as (
select '11' as x  from dual
union
select '222' as x  from dual
)
SELECT x, LEVEL from temp t
        CONNECT BY LEVEL <= LENGTH(t.x) 
and prior x = x
and prior sys_guid() is not null;    

最後の行はトリックを行います。PRIOR への他の参照でも同じことが達成できます。

with temp as (
select '11' as x  from dual
union
select '222' as x  from dual
)
SELECT x, LEVEL from temp t
        CONNECT BY LEVEL <= LENGTH(t.x) 
and PRIOR x = x
and PRIOR DBMS_RANDOM.VALUE () IS NOT NULL;    
于 2014-09-16T22:34:03.080 に答える
2

11g を使用しているため、再帰サブクエリ ファクタリングを使用してこれを実現できます。

with t as (
  select 11 as x  from dual
  union all
  select 222 as x  from dual
),
r (x, idx, len) as (
  select x, 1, length(x)
  from t
  union all
  select r.x, r.idx + 1, r.len
  from r
  where r.idx < r.len
)
select x from r
order by x;

    X
-----
   11
   11
  222    
  222
  222

アンカー メンバーは、元の行と値の長さを取得します。再帰メンバーはidx、長さに達するまで 1 を追加します。

SQLフィドル

階層クエリでも実行できます。

with t as (
  select 11 as x  from dual
  union all
  select 222 as x  from dual
)
select x
from t
connect by level <= length(x)
and prior x = x
and prior sys_guid() is not null;

2 つの句の組み合わせprior- 1 つは重複を制限し、もう 1 つはそれを行うときに循環を防ぐために非決定論的関数を含む - 目的の行を提供します。

    X
-----
   11
   11
  222    
  222
  222

SQLフィドル

于 2014-09-16T22:34:51.327 に答える