トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

7-79 C言語やJavaの0から始まる配列に変換

SQLパズル

テーブル
Val
---
 10
 20
 30
 40
 50
 60
 70
 80
 90

件数が奇数の場合は、この順序で出力する。

出力結果
Val
---
 10
 50
 20
 60
 30
 70
 40
 80
 90

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

テーブル
Val
---
 10
 20
 30
 40
 50
 60
 70
 80
 90
100

件数が偶数の場合は、この順序で出力する。

出力結果
Val
---
 10
 60
 20
 70
 30
 80
 40
 90
 50
100


SQL

select Val,rn,cnt
from (select column_value as Val,
      -1+Row_Number() over(order by column_value) as rn,
      -1+count(*) over() as cnt
        from table(sys.odciNumberList(10,20,30,40,50,60,70,80,90)))
order by
case rn when cnt then 1 else 0 end,
mod(rn,cnt/2),rn;

Val  rn  cnt
---  --  ---
 10   0    8
 50   4    8
 20   1    8
 60   5    8
 30   2    8
 70   6    8
 40   3    8
 80   7    8
 90   8    8

select Val,rn,cnt
from (select column_value as Val,
      -1+Row_Number() over(order by column_value) as rn,
      -1+count(*) over() as cnt
        from table(sys.odciNumberList(10,20,30,40,50,60,70,80,90,100)))
order by
case rn when cnt then 1 else 0 end,
mod(rn,cnt/2),rn;

Val  rn  cnt
---  --  ---
 10   0    9
 60   5    9
 20   1    9
 70   6    9
 30   2    9
 80   7    9
 40   3    9
 90   8    9
 50   4    9
100   9    9


解説

C言語やJavaの0から始まる配列の感覚を使ってます。
バイナリサーチやクイックソートでよく使われます :-)

1から開始される配列よりも
0から開始される配列のほうが便利な時は、変換してもいいでしょう。