2009.11.23 Monday
Firebirdユーザコンテキスト変数を使ったdense_rank()
[2009-11-24 Firebirdのユーザコンテキスト変数は、左から右に評価されないようで、以下は単にrownumになっていますorz 近日修正しますので、いましばらくお待ちください]
以前MySQLユーザ変数を使ったdense_rank()を紹介しましたが、
下記はそのFirebird版です。
Firebirdではrdb$set_context()が値ではなく、既存の設定あり(1), なし(0)になってしまうので、
Firebirdの組み込み関数に追加されたdecode()(Oracleと同じ)で、値を返すようにしています。
QL> --Like dense_rank()
SQL> select rdb$set_context('USER_SESSION', 'rnk', 0), rdb$set_context('USER_SESSION', 'preval', null) from rdb$database;
RDB$SET_CONTEXT RDB$SET_CONTEXT
=============== ===============
0 0
SQL> select case when cast(rdb$get_context('USER_SESSION', 'preval') as int) <> sal then cast(rdb$get_context('USER_SESSION', 'rnk') as int)
CON> ELSE decode(rdb$set_context('USER_SESSION', 'rnk', cast(rdb$get_context('USER_SESSION', 'rnk') as int) + 1),1,cast(rdb$get_context('USER_SESSION', 'rnk') as int)) END,
CON> decode(cast(rdb$set_context('USER_SESSION', 'preval', sal) as int), 1, sal,sal) from emp order by sal;
CASE CASE
============ ============
1 800
2 950
3 1100
4 1250
5 1250
6 1300
7 1500
8 1600
9 2450
10 2850
11 2975
12 3000
13 3000
14 5000
以前MySQLユーザ変数を使ったdense_rank()を紹介しましたが、
下記はそのFirebird版です。
Firebirdではrdb$set_context()が値ではなく、既存の設定あり(1), なし(0)になってしまうので、
Firebirdの組み込み関数に追加されたdecode()(Oracleと同じ)で、値を返すようにしています。
QL> --Like dense_rank()
SQL> select rdb$set_context('USER_SESSION', 'rnk', 0), rdb$set_context('USER_SESSION', 'preval', null) from rdb$database;
RDB$SET_CONTEXT RDB$SET_CONTEXT
=============== ===============
0 0
SQL> select case when cast(rdb$get_context('USER_SESSION', 'preval') as int) <> sal then cast(rdb$get_context('USER_SESSION', 'rnk') as int)
CON> ELSE decode(rdb$set_context('USER_SESSION', 'rnk', cast(rdb$get_context('USER_SESSION', 'rnk') as int) + 1),1,cast(rdb$get_context('USER_SESSION', 'rnk') as int)) END,
CON> decode(cast(rdb$set_context('USER_SESSION', 'preval', sal) as int), 1, sal,sal) from emp order by sal;
CASE CASE
============ ============
1 800
2 950
3 1100
4 1250
5 1250
6 1300
7 1500
8 1600
9 2450
10 2850
11 2975
12 3000
13 3000
14 5000









![SoftwareDesign(ソフトウェアデザイン) 2010年 01月号 [雑誌]](http://ecx.images-amazon.com/images/I/51tygaEdlqL._SL160_.jpg)





![一太郎2010 [25周年記念パック] 特別優待版](http://ecx.images-amazon.com/images/I/51otQQZQZTL._SL160_.jpg)
![JUST Suite 2010 [一太郎25周年記念パック] 特別優待版](http://ecx.images-amazon.com/images/I/514SvkJV%2BwL._SL160_.jpg)
![日経ソフトウエア 2010年 01月号 [雑誌]](http://ecx.images-amazon.com/images/I/617bY1RWgRL._SL160_.jpg)
![Software Design ( ソフトウェアデザイン ) 2010年 02月号 [雑誌]](http://ecx.images-amazon.com/images/I/51rHLVkJy4L._SL160_.jpg)




