由于您使用的是 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 小提琴。