Oracle SQL 関数 : SIGN : 符号チェック
numberRet := SIGN( numberSrc ); SIGNは数値データnumberSrcが0(ゼロ)より小さい場合は-1を返し、numberSrcが0(ゼロ)の 場合は0(ゼロ)を返し、numberSrcが0(ゼロ)より大きい場合は1を返します。 numberSrcは数値を返す式を指定できます。
SQL> SELECT SIGN(-12),SIGN(0),SIGN(10) FROM DUAL; |
SIGN(-12) SIGN(0) SIGN(10) |
---------- ---------- ---------- |
-1 0 1 |
このSIGN関数と前述のDECODE関数を組み合わせることで、割と複雑なことが可能になります。
以下に簡単な例を示します。
SQL> SELECT EMPNO,SAL,DECODE(SIGN(SAL - 1500),-1, '1500未満' ,0, '1500同じ' ,1, '1500より大きい' ) FROM EMP; |
EMPNO SAL DECODE(SIGN(SA |
---------- ---------- -------------- |
7369 800 1500未満 |
7499 1600 1500より大きい |
7521 1250 1500未満 |
7566 2975 1500より大きい |
7654 1250 1500未満 |
7698 2850 1500より大きい |
7782 2450 1500より大きい |
7788 3000 1500より大きい |
7839 5000 1500より大きい |
7844 1500 1500同じ |
7876 1100 1500未満 |
EMPNO SAL DECODE(SIGN(SA |
---------- ---------- -------------- |
7900 950 1500未満 |
7902 3000 1500より大きい |
7934 1300 1500未満 |
14行が選択されました。 |
さらに SIGN 関数と前述の DECODE 関数を組み合わせる例を示します。
「TM_担当者」の部門コードでコードの値が「1」の担当者のみを「1」として返し、
その他を「0」として返します。
SQL> SELECT DECODE(SIGN(部門コード - 1), 0, 1, 0) FROM TM_担当者; |
DECODE(SIGN(部門コード-1),0,1,0) |
-------------------------------- |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
9行が選択されました。 |
そこで部門コードが「2」の担当者のみを「1」その他を「0」とする DECODE 関数処理と、
部門コードが「3」の担当者のみを「1」その他を「0」とする DECODE 関数処理を追加します。
そうすると、以下の様に部門コード毎に対応するレコードが抽出できます。
SQL> SELECT |
2 DECODE(SIGN(部門コード - 1), 0, 1, 0) AS 部門1 |
3 ,DECODE(SIGN(部門コード - 2), 0, 1, 0) AS 部門2 |
4 ,DECODE(SIGN(部門コード - 3), 0, 1, 0) AS 部門3 |
5 FROM TM_担当者; |
部門1 部門2 部門3 |
---------- ---------- ---------- |
1 0 0 |
1 0 0 |
1 0 0 |
1 0 0 |
0 1 0 |
0 1 0 |
0 0 1 |
0 0 1 |
0 0 1 |
9行が選択されました。 |
上の例の「部門1」「部門2」「部門3」のところで SUM 関数をとってやれば、 一括で部門毎の件数が取得できます。
SQL> SELECT |
2 SUM (DECODE(SIGN(部門コード - 1), 0, 1, 0)) AS 部門1 |
3 , SUM (DECODE(SIGN(部門コード - 2), 0, 1, 0)) AS 部門2 |
4 , SUM (DECODE(SIGN(部門コード - 3), 0, 1, 0)) AS 部門3 |
5 FROM TM_担当者; |
部門1 部門2 部門3 |
--------- ---------- ---------- |
4 2 3 |
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。