DB/Oracle/PLSQL/分岐

目次

処理を条件によって分岐させる。いわゆる IF 文と CASE 文。


IF 文

IF 文による分岐。ほかの言語と一緒なので説明するほどのものでもないなあという印象。

  • IF 文の記述
    declare
        hoge number := 10;
    begin
        -- IF 文開始
        if hoge > 100 then
            ...
        -- 複数条件の場合は ELSIF で並べる
        elsif hoge > 50 then
            ...
        -- すべて合致しなかったらこれを実行
        else
            ...
        -- IF 文終了
        end if;
    end;
    

CASE 文

CASE 文による分岐。ほかの言語と一緒なので説明するほどのものでもないなあという印象。

CASE 式と CASE 文があるらしい。値の代入に使うのが CASE 式、処理の分岐に使うのが CASE 文。

CASE 式

値を代入するときに使う。

  • CASE 式
    declare
        hoge number := 1;
        fuga varchar2(10);
    begin
        -- hoge の値に応じて fuga に代入する値を変える
        fuga := case hoge
            when 1 then 'foo'
            when 2 then 'bar'
            else 'baz'
        end; 
    
        -- 別の書き方。when にはブール値を返す判定式を自由に書ける
        fuga := case
            when hoge = 1 then 'foo'
            when hoge = 2 then 'bar'
            else 'baz'
        end; 
    end;
    

CASE 文

IF 文と同じことを CASE 文でもかける。たぶん IF 文のが一般的。

  • CASE 文
    declare
        hoge number := 1;
    begin
        case hoge
            when 1 then
                ...
            when 2 then
                ...
            else
                ...
        end case;
    end;
    

NULL 値の扱い

NULL 値との単純な比較(大なり、小なり、イコールなど)は常に結果は NULL になる。TRUE でも FALSE でもなくて NULL。

論理演算の場合はちょっと複雑。

NULL になった場合、その条件の場合の実行文は実行されない。

NULL の単純比較

大小比較、等値比較などの単純な比較の場合、結果は常に NULL になる。IF 文や CASE 文で判定結果が NULL だった場合、その部分は実行されない。制御の上では扱いは FALSE と同じ。

  • NULL の例
    declare
        hoge number;
    begin
        -- hoge は NULL 
        if hoge > 100 then
            -- ここは実行されない
            ...
        else
            -- 今回の場合はここが実行される
            ...
        end if;
    end;
    

NULL の論理演算

TRUE と FALSE と NULL とを AND とか OR で演算したらどうなるのという話。

  • AND 論理演算
    ANDTFN
    TTFN
    FFFF
    NNFN
  • OR 論理演算
    ORTFN
    TTTT
    FTFN
    NTNN
  • NOT 論理演算
    NOT
    TF
    FT
    NN

基本的な考え方は以下の通り。

  • AND 条件では FALSE が優先。OR 条件では TRUE が優先
  • AND は両方 TRUE のときのみ TRUE
  • OR は両方 FALSE のときのみ FALSE

Last-modified: 2011-11-08 (火) 10:39:12