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直到达到长度。

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;

这两个prior子句的组合 - 一个限制重复,另一个涉及非确定性函数以防止在您这样做时循环 - 为您提供所需的行:

    X
-----
   11
   11
  222    
  222
  222

SQL 小提琴

于 2014-09-16T22:34:51.327 回答
-1
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)
order by 1
于 2015-03-11T05:43:40.767 回答