SQLにおける条件・ループ文の適用整理
引用:
プログラマー一族として、どんな言語でも基本的な文は順序、条件(選択)、ループという3つの論理構造から離れられず、あまり使わないと曖昧になる知識もあるので、簡単な知識点でもまとめたいです.
1、条件ブランチ(SQLの条件ブランチの実現は主に二つの形式がある:CaseとIf)
1.1 Case When文
Case whenには、単純Case関数とCase探索関数の2つのフォーマットがあります.また、Case関数は最初の条件に一致する値のみを返し、残りのCase部分は自動的に無視されます(また、Oracleでは任意のデータ・オブジェクトの名前の長さが30文字を超えることはできません.戻り値も30文字を超えることはできません.MSSQLではこの制限があるかどうかは分かりません).
1.1.1単純Case関数
1.1.2 Case検索関数
条件式1が成立すると男を返し、条件式2が成立すると値2を返し、そうでないと値3を返し、条件式にはネストしたり、関数を呼び出したりすることができます.合理的な論理式は何でもいいです.
1.1.3 Caseの実用化:
1.1.3.1各クラスの男子人数と女子人数を統計する
1.1.3.2各クラスの成績は点数によって等級付けして人数を統計する
1.1.3.3給与管理において異なる更新条件を実現し、給与以上の社員、給与がXXを減少し、給与がXからXXまでの間の社員、給与がXを増加する
1.2 Oracle固有のDecode
1.2 If条件分岐文
まとめ:
Case関数はDECODE関数とは異なります.Case関数では、BETWEEN、LIKE、IS NULL、IN、EXISTSなどを用い、Case関数にCase関数をネストすることにより、合計関数にCase関数を用いるなどの方法を用いてもよいし、Check、フリップフロップなどにCaseを用いてもよい.
2、循環分岐ForとWhile
2.1 Forサイクル
2.2 Whileサイクル
2.3簡単な応用
1~100の合計を計算
プログラマー一族として、どんな言語でも基本的な文は順序、条件(選択)、ループという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 End
:
case 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( , 1, 2, 3)
, 1 , 2, 3
1, 2, 3
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;