「IF」「THEN」「ELSE」というのは、プログラム言語には必須の制御のひとつですが、その機能を提供する関数が DECODE です。
ORACLEユーザの方は是非とも使いこなして頂きたい関数です。
これを使いこなせるようになると、大抵のことが一つのSQLで行えるようになることがおわかり頂けると思います。
使用例を示すと
SQL > SELECT NAME "氏名" , SEX 2 > , DECODE( SEX , 1 , '男' , '女' ) "性別" 3 > FROM PERSONAL ; 氏名 SEX 性別 --------------------- ---- ---- 徳川 家康 1 男 与謝野 晶子 2 女
IF SEX = 1 THEN RETURN '男'; ELSE RETURN '女'; END IF;
IF SEX = 1 THEN RETURN '男'; ELSIF SEX = 2 THEN RETURN '女'; ELSE RETURN '不明'; END IF;
SQL > SELECT SUM( DECODE( SEX , 1 , 1 , 0 ) ) "男性の人数"
2 > , SUM( DECODE( SEX , 2 , 1 , 0 ) ) "女性の人数"
3 > FROM PERSONAL ;
男性の人数 女性の人数
---------- ---------
198 172
SQL > SELECT COUNT( SEX ) "男性の人数" 2 > FROM PERSONAL 3 > WHERE SEX = 1 ; SQL > SELECT COUNT( SEX ) "女性の人数" 2 > FROM PERSONAL 3 > WHERE SEX = 2 ;
SQL > SELECT COUNT( A.SEX ) "男性の人数" 2 > , COUNT( B.SEX ) "女性の人数" 3 > FROM PERSONAL A , PERSONAL B ; 4 > WHERE A.PERSONAL_ID = B.PERSONAL_ID 5 > AND A.SEX = 1 AND B.SEX = 2 ;
IF A = B THEN
...
ELSEIF A = C THEN
...
ELSE
...
END IF;
IF A > B THEN
return 'Aの方が大きい'
ELSEIF A < B THEN
return 'Bの方が大きい'
ELSE
return '同じ大きさ'
END IF;
SQL > SELECT SIGN( 12 ) , SIGN( 0 ) , SIGN( -2 )
2 > FROM DUAL ;
SIGN( 12 ) SIGN( 0 ) SIGN( -2 )
--------------------------
1 0 -1
SQL > SELECT DECODE( SIGN( A - B ) 2 > , 1, 'Aの方が大きい' 3 > , -1, 'Bの方が大きい' 4 > , '同じ大きさ' 5 > ) 6 > FROM DUAL ;