

oracleで下記のようなSQL文をwhere句に入れて、case文に導入して条件分岐させたいです。

前提事項として下記のようなカラムが存在  
A=ID最終利用日  
B=ID登録日  
C=ID公開日

下記のようなwhere句に入れて、case文に導入して条件分岐させたいSQL

Aのカラムがnull でなければAのカラムを参照  
Aのカラムがnull and 公開日 > 登録日 であれば 公開日を参照  
Aのカラムがnull and 発売日 < 登録日 であれば 登録日を参照

上記のようなSQLをwhere句に入れて、case文に導入してから条件分岐させたいのですが、  
where句に入れて、case文では上記に沿う文法が解らずうまくいきません。

上記のようなアルゴリズムを導入するのに適したoracleでの文法を教えてください。


CC BY-SA 4.0
2019-11-11T13:03:38.107
60415
2019-11-12T02:13:01.883
2019-11-12T02:13:01.883
3060
36290
question
sql oracle
oracleで下記のようなSQL文をwhere句に入れて、case文に導入して条件分岐させたいです。


where句でcase文が使えますので、`A,B,C`カラムをwhere句のcase文でご参照ください。  
上記のようなアルゴリズムを導入するのに適したoracleでの文法は`nvl`と`greatest`を併用して、Aがない時はBとCの大きい値を参照する方法です。  
ただし質問文の条件ではBとCが同値の場合の挙動が記述されていませんので、要求に合わせた改修をお願いいたします。

[code]

    select nvl(A, greatest(B, C)) as NVL_GREATEST,
           case when A is null then
                case when B > C then B
                     when B < C then C
                     else null          -- この行はなくても同じ
                end
                else A
           end  CASE_NEST
    from  (select to_date('2019/01/01') as A, to_date('2019/11/02') as B, to_date('2019/11/03') as C from dual union all -- Aが存在
           select null                  as A, to_date('2019/11/02') as B, to_date('2009/01/03') as C from dual union all -- Bが大きい
           select null                  as A, to_date('2009/01/02') as B, to_date('2019/11/03') as C from dual union all -- Cが大きい
           select null                  as A, to_date('2019/11/11') as B, to_date('2019/11/11') as C from dual           -- BとCが同値
          )
    where sysdate > case when A is null then
                         case when B > C then B
                              when B < C then C
                              else null
                         end
                         else A
                    end
    --where sysdate > nvl(A, greatest(B, C))
    
[/code]


CC BY-SA 4.0
2019-11-12T01:39:12.633
60429
2019-11-12T01:39:12.633
9820
60415
answer