SQLにおける条件・ループ文の適用整理

10324 ワード

引用:
プログラマー一族として、どんな言語でも基本的な文は順序、条件(選択)、ループという3つの論理構造から離れられず、あまり使わないと曖昧になる知識もあるので、簡単な知識点でもまとめたいです.
1、条件ブランチ(SQLの条件ブランチの実現は主に二つの形式がある:CaseとIf)
1.1 Case When文
Case whenには、単純Case関数とCase探索関数の2つのフォーマットがあります.また、Case関数は最初の条件に一致する値のみを返し、残りのCase部分は自動的に無視されます(また、Oracleでは任意のデータ・オブジェクトの名前の長さが30文字を超えることはできません.戻り値も30文字を超えることはできません.MSSQLではこの制限があるかどうかは分かりません).
1.1.1単純Case関数
 : sex='0'    ,sex='1''  '
Case sex        
    when'0' then' '        
    when '1' then' '        
Else'  ' End

1.1.2 Case検索関数
条件式1が成立すると男を返し、条件式2が成立すると値2を返し、そうでないと値3を返し、条件式にはネストしたり、関数を呼び出したりすることができます.合理的な論理式は何でもいいです.
Case When      1 then  1        
    When      2 then  2        
Else  3 Endcase when F_RCJC_UserInPersonIds(e.Pdm_Rcjc_Entrusttestid,'{@sysuserid}')='1' and e.State>32 then '1' 
               when F_RCJC_UserInPersonIds(e.Pdm_Rcjc_Entrusttestid,'{@sysuserid}')='1' and  e.State=32 then '0'
                      else '2' end)  OperateState

1.1.3 Caseの実用化:
1.1.3.1各クラスの男子人数と女子人数を統計する
Select 
SUM(case when sex='1' then 1 else 0 end)    ,
SUM(case when sex='0' then 1 else 0 end )    
From T_Students
Group by grade

1.1.3.2各クラスの成績は点数によって等級付けして人数を統計する
Select grade,(case when score<60 then '   '  
    when score>=60 and score<=70 then '  '  
    when score>70 and score<=90 then '  '  
    when score>90 then '  '  
    else null end) ScoreClass,  
    COUNT(*)     
From T_Students    
Group by grade,  
(case when score<60 then '   '  
    when score>=60 and score<=70 then '  '  
    when score>70 and score<=90 then '  '  
    when score>90 then '  '  
    else null end)   
    order by grade  

1.1.3.3給与管理において異なる更新条件を実現し、給与以上の社員、給与がXXを減少し、給与がXからXXまでの間の社員、給与がXを増加する
Update T_Employee       
    Set salary = (case when salary >= 6000 then salary * 0.9  
    when salary >= 2400 AND salary < 5600 then salary * 1.15  
    else salary end

1.2 Oracle固有のDecode
**decode**(  , 1,   1, 2,   2,... n,   n,   )
        :
IF   = 1 THEN
    RETURN(   1)
ELSIF   = 2 THEN
    RETURN(   2)
    ......
ELSIF   = n THEN
    RETURN(   n)
ELSE
    RETURN(   )
END IF

decode(        , 123)

                 ,              123
   123       

1.2 If条件分岐文
**Oracle MSsql        :MSsql  else if Oracle   elsif**
IF   = 1 THEN
    RETURN(   1)
ELSIF   = 2 THEN
    RETURN(   2)
    ......
ELSIF   = n THEN
    RETURN(   n)
ELSE
    RETURN(   )
END IF

まとめ:
Case関数はDECODE関数とは異なります.Case関数では、BETWEEN、LIKE、IS NULL、IN、EXISTSなどを用い、Case関数にCase関数をネストすることにより、合計関数にCase関数を用いるなどの方法を用いてもよいし、Check、フリップフロップなどにCaseを用いてもよい.
2、循環分岐ForとWhile
2.1 Forサイクル
for      in      ...     loop     end loop;

2.2 Whileサイクル
              
**while**       loop 
      
end loop; 

2.3簡単な応用
1~100の合計を計算
**for  :**
for i in 1..100 loop   
  i:=i+1;  
end loop

**While  :**
while i<100 loop 
  i:=i+1; 
end loop;