connect-by; 26 , . ASCII , ascii() 1-26 . :
var str varchar2(26);
exec :str := 'ABCDFGZ';
with alphabet as (
select level as pos
from dual connect by level <= 26
),
chars as (
select substr(:str, level, 1) character,
ascii(substr(:str, level, 1)) - 64 as pos
from dual connect by level <= length(:str)
)
select listagg(nvl(chars.character, ' '))
within group (order by alphabet.pos) as result
from alphabet
left outer join chars on chars.pos = alphabet.pos;
RESULT
ABCD FG Z
SQL * Plus, , .
, . ( , ) , ( , ). , .
create view v42 as
with possible as (
select id, str, level as pos
from t42
connect by level <= 26
and prior id = id
and prior sys_guid() is not null
),
actual as (
select id, substr(str, level, 1) character,
ascii(substr(str, level, 1)) - 64 as pos
from t42
connect by level <= length(str)
and prior id = id
and prior sys_guid() is not null
)
select possible.id, possible.str, listagg(nvl(actual.character, ' '))
within group (order by possible.pos) as result
from possible
left outer join actual on actual.id = possible.id and actual.pos = possible.pos
group by possible.id, possible.str;
select * from v42 :
ID STR RESULT
---------- -------------------------- --------------------------
1 A A
2 Z Z
3 AZ A Z
4 ABCDFGZ ABCD FG Z
5 ABCDEGHIJKLMNOPQTUVWXYZ ABCDE GHIJKLMNOPQ TUVWXYZ
- SQL Fiddle.
CTE. , . , ...
CTE, :
create view v42 as
with possible(id, str, pos, character) as (
select id, str, 1, 'A'
from t42
union all
select id, str, pos + 1, chr(64 + pos + 1)
from possible
where pos < 26
),
actual (id, str, pos, character) as (
select id, str, 1, substr(str, 1, 1)
from t42
union all
select id, str, pos + 1, substr(str, pos + 1, 1)
from actual
where pos < length(str)
)
select possible.id, possible.str, listagg(nvl(actual.character, ' '))
within group (order by possible.pos) as result
from possible
left outer join actual
on actual.id = possible.id
and actual.character = possible.character
group by possible.id, possible.str;
(SQL Fiddle , " SQL".)