Oracle Decode()関数使用テクニック共有


今日の上で似たような機能を要求しました。最初に考えた列の転職ですが、どのように実現してもいい方法はありません。この関数がいいDECODE関数はORACLE PL/SQLは機能が強い関数の一つです。今はORACLEのSQLだけがこの関数を提供しています。彼のデータベースメーカーのSQL実現にはまだこの機能がありません。DECODEはどんな用途がありますか?まず一例を作ります。私たちが智星職員に給料を上げるとしたら、その基準は給料が8000元以下の場合は20%加算されます。給料は8000元以上で15%を加算しますが、記録中の給与フィールドの値を先に選ぶのが一般的ですか?select salary into var-salary from empployeeは、変数var-salaryに対してif-then-elseやchose caseなどのフロー制御文で判断します。DECODE関数を使えば、これらのフロー制御文を省略してSQL文で直接完成できます。select decode(sign(salary-8000)、1、salary*1.15、-1、salary*1.2、salary from employeeはとても簡潔ですか?DECODEの文法:DECODE(value,if 1,then 1,if 2,then 2,if 3,then 3,…,else)は、valueがif 1に等しい場合、DECODE関数の結果がthen 1に戻ることを表しています。初めて見ると、DECODEはイコールテストしかできませんでしたが、先ほども見ました。いくつかの関数や計算によってvalueに取って代わることができます。DECODE関数は、より大きく、小さい、または同等の機能を備えています。
DECODE(条件、値1、翻訳値1、値2、翻訳値2、…値n、翻訳値n、デフォルト値)DECODE(フィールド、比較1、値1、比較2、値2、…、比較n、値nのデフォルト値)  この関数の意味は、IF条件=値1 THEN RETURN(翻訳値1)ELSIF条件=値2 THEN RETURN(翻訳値2)...ELSIF条件=値n THEN RETURN(翻訳値n)ELESE RETURN(デフォルト値)END IF
decode()関数使用テクニック
・ソフトウェア環境:
1、Windows NT 4.0+ORACLE 8.0.4
2、ORACLEの設置経路は:C:/ORANT
・使い方:
1、サイズの比較
select decode(sign(変数1-変数2)-1,変数1,変数2)from dual;小さい値を取る
sign()関数は、ある値が0か正数かそれとも負かによって、それぞれ0、1、-1を返します。
たとえば:
変数1=10、変数2=20
sign(変数1-変数2)は-1に戻り、decode復号結果は「変数1」となり、より小さい値を取る目的となります。
2、表、図の構造転換
既存の商品の販売表saleは、テーブル構造:
month char(6)--月
sell number(10,2)--月間販売金額
既存のデータ:
200001,000
200002
200003,1200
200004,1300
200005,1400
200006,1500
200007 1600
200101。
200202
200301
以下の構造に変換したいデータ:
year char(4)--年
month 1 number(10,2)--1月の販売金額
month 2 number(10,2)--2月の販売金額
モント3 number(10,2)--3月の販売金額
モント4 number(10,2)--4月の販売金額
モント5 number(10,2)--5月の販売金額
モント6 number(10,2)--6月の販売金額
モント7 number(10,2)--7月の販売金額
month 8 number(10,2)--8月の販売金額
モント9 number(10,2)--9月の販売金額
month 10 number(10,2)--10月の販売金額
month 11 number(10,2)--11月の販売金額
month 12 number(10,2)--12月の販売金額
構造変換のSQL文は次の通りです。
create or replace view
v_sale(year,month 1,month 2,month 3,month 4,month 5,month 6,month 7,month 8,month 9,month 10,month 11,month 12)
as
プロジェクト
substrob(month,1,4)
sum(decode(substrob(month,5,2),'01',sell,0))
sum(decode(substrob(month,5,2),'02',sell,0))
sum(decode(substrob(month,5,2),'03',sell,0))
sum(decode(substrob(month,5,2),'04',sell,0)) 
=========================================================================================================
追加1:
学生の成績表studentがあります。今はdecode関数で以下のいくつかの機能を実現します。成績>85、優秀を表示します。70の表示が良好です。>60に合格しますさもなくば不合格です。
studentの番号はidで、成績はscoreであると仮定すると、select id、decode(sign(score-85)、1、「優秀」、0、「優秀」、「優秀」、-1、decode(score-70)、1、「良好」、0、「良好」
=========================================================================================================
補足2:Decode関数の文法構造は以下の通りです。decode(expression、search_)1,レスルトン1)decode(expression、search_1,レスルトン1,search_2,レスター2)decode(expression、search_1,レスルトン1,search_2,レスター2,…,search_n,reult_n)
decode(expression、search_1,レスルトン1,default)decode(expression,search_1,レスルトン1,search_2,レスター2,default)decode(expression,search_1,レスルトン1,search_2,レスター2,…,search_n,reult_n,default)
decode関数は、式と検索語を比較します。一致すれば、結果を返します。一致しない場合は、default値を返します。default値が指定されていない場合は、空の値を返します。以下は簡単なテストです。Decode関数の使い方を説明します。SQL>create table t as select username、default_テーブルspace、ロックダテfrom dbaアメリカ
Table created.
SQL>select*from t;
USERNAME                        DEFAULT_TABLESPACE              LOCK_DATE------------------------------SYS                             SYSTEM                          SYSTEMOUTLN                           SYSTEMCSMIG                           SYSTEMSCOTT                           SYSTEMEYGLE                           USERSDBSNMP                          SYSTEM WMSYS                           SYSTEM                          20-OCT-04
8ローソンselected.
SQL>select username,decode(lock_)date,null,'unlocked','locked')status from t;
USERNAME                        STATUS----------------SYS                             unlockedSYSTEM                          unlockedOUTTLN                           unlocked CSMIG                           unlocked SCOTT                           unlocked EYGLE                           unlockedDBSNMP                          unlockedWMSYS                           ロックド
8ローソンselected.
SQL>select username,decode(lock_)date,null,'unlocked')status from t;
USERNAME                        STATUS----------------SYS                             unlockedSYSTEM                          unlockedOUTTLN                           unlocked CSMIG                           unlocked SCOTT                           unlocked EYGLE                           unlockedDBSNMP                          unlocked WMSYS 8 rows selected.