トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-39 インラインビューとの直積演算
SQLパズル
StringTable
ColA ColB ColC ColD
---- ---- ---- ----
'AL' 'AM' 'AN' 'AO'
'BL' 'BM' 'BN' 'BO'
列を行に変換して出力する。
出力結果
ColX
-----
'AL'
'AM'
'AN'
'AO'
'BL'
'BM'
'BN'
'BO'
データ作成スクリプト
create table StringTable(
ColA char(4),
ColB char(4),
ColC char(4),
ColD char(4));
insert into StringTable values('''AL''','''AM''','''AN''','''AO''');
insert into StringTable values('''BL''','''BM''','''BN''','''BO''');
commit;
SQL
--■■■union allを使う方法■■■
select ColA as ColX from StringTable
union all
select ColB from StringTable
union all
select ColC from StringTable
union all
select ColD from StringTable
order by 1;
--■■■インラインビューとの直積演算を使う方法■■■
select case b.No
when 1 then a.ColA
when 2 then a.ColB
when 3 then a.ColC
when 4 then a.ColD end as ColX
from StringTable a,
(select 1 as No from dual
union all select 2 from dual
union all select 3 from dual
union all select 4 from dual) b
order by ColX;
--■■■model句を使う方法(10g以降)■■■
select OutVal
from StringTable
model
partition by (RowNum as Rn)
dimension by (1 as soeji)
measures(ColA as OutVal,ColA,ColB,ColC,ColD)
rules(OutVal[1] = ColA[1],
OutVal[2] = ColB[1],
OutVal[3] = ColC[1],
OutVal[4] = ColD[1])
order by Rn,OutVal;
解説
インラインビューとの直積演算を使う方法では、
インラインビューで4行作成し、直積演算した後、
単純case式で、出力する列を分岐させてます。