試しに
SQL
1 create table tbl ( code int , license_a varchar ( 20 ) , date_a date , license_b varchar ( 29 ) , date_b date ) ;
2 insert into tbl values
3 ( 1 , 'a' , '2017-01-01' , 'b' , '2018-01-01' ) , /* 両方過去 a<b 結果:b */
4 ( 2 , 'a' , '2018-01-01' , 'b' , '2017-01-01' ) , /* 両方過去 a>b 結果:a */
5 ( 3 , 'a' , '2018-01-01' , 'b' , '2018-01-01' ) , /* 両方過去 a=b 結果:a */
6 ( 4 , 'a' , '2020-01-01' , 'b' , '2018-01-01' ) , /* aのみ未来 結果:b */
7 ( 5 , 'a' , '2018-01-01' , 'b' , '2020-01-01' ) , /* bのみ未来 結果:a */
8 ( 6 , 'a' , '2020-01-01' , 'b' , '2021-01-01' ) , /* 両方未来 a<b 結果:NULL */
9 ( 7 , 'a' , '2021-01-01' , 'b' , '2020-01-01' ) , /* 両方未来 a>b 結果:NULL */
10 ( 8 , 'a' , '2019-03-13' , 'b' , '2020-01-01' ) , /* a当日,b未来 結果:a */
11 ( 9 , 'a' , '2019-03-13' , 'b' , '2018-01-01' ) , /* a当日,b過去 結果:a */
12 ( 10 , 'a' , '2020-01-01' , 'b' , '2019-03-13' ) , /* b当日,a未来 結果:b */
13 ( 11 , 'a' , '2018-01-01' , 'b' , '2019-03-13' ) , /* b当日,a過去 結果:b */
14 ( 12 , 'a' , '2019-03-13' , 'b' , '2019-03-13' ) ; /* a,b当日 結果:a */
上記を冗長に命題に当てはめると
SQL
1 select code , case
2 when date_a <= '2019-03-13' and date_b <= '2019-03-13' and date_a < date_b then license_b
3 when date_a <= '2019-03-13' and date_b <= '2019-03-13' and date_a >= date_b then license_a
4 when date_a <= '2019-03-13' and date_b >= '2019-03-13' then license_a
5 when date_a >= '2019-03-13' and date_b <= '2019-03-13' then license_b
6 when date_a >= '2019-03-13' and date_b >= '2019-03-13' then null
7 end as lincese
8 from tbl
結果:b-a-a-b-a-null-null-a-a-b-b-a
上記まとめると
SQL
1 select code , case
2 when least ( date_a , date_b ) > '2019-03-13' then null
3 when not ( date_a >= date_b ) = ( '2019-03-13' >= greatest ( date_a , date_b ) ) then license_b
4 else license_a
5 end as lincese
6 from tbl
※こっちもXORを排除
日付NULLあり
SQL
1 create table tbl ( code int , license_a varchar ( 20 ) , date_a date null , license_b varchar ( 29 ) , date_b date null ) ;
2 insert into tbl values
3 ( 1 , 'a' , '2017-01-01' , 'b' , '2018-01-01' ) , /* 両方過去 a<b 結果:b */
4 ( 2 , 'a' , '2018-01-01' , 'b' , '2017-01-01' ) , /* 両方過去 a>b 結果:a */
5 ( 3 , 'a' , '2018-01-01' , 'b' , '2018-01-01' ) , /* 両方過去 a=b 結果:a */
6 ( 4 , 'a' , '2020-01-01' , 'b' , '2018-01-01' ) , /* aのみ未来 結果:b */
7 ( 5 , 'a' , '2018-01-01' , 'b' , '2020-01-01' ) , /* bのみ未来 結果:a */
8 ( 6 , 'a' , '2020-01-01' , 'b' , '2021-01-01' ) , /* 両方未来 a<b 結果:NULL */
9 ( 7 , 'a' , '2021-01-01' , 'b' , '2020-01-01' ) , /* 両方未来 a>b 結果:NULL */
10 ( 8 , 'a' , '2020-01-01' , 'b' , '2020-01-01' ) , /* 両方未来 a=b 結果:NULL */
11 ( 9 , 'a' , '2019-03-13' , 'b' , '2020-01-01' ) , /* a当日,b未来 結果:a */
12 ( 10 , 'a' , '2019-03-13' , 'b' , '2018-01-01' ) , /* a当日,b過去 結果:a */
13 ( 11 , 'a' , '2020-01-01' , 'b' , '2019-03-13' ) , /* b当日,a未来 結果:b */
14 ( 12 , 'a' , '2018-01-01' , 'b' , '2019-03-13' ) , /* b当日,a過去 結果:b */
15 ( 13 , 'a' , '2019-03-13' , 'b' , '2019-03-13' ) , /* a,b当日 結果:a */
16 ( 14 , 'a' , NULL , 'b' , '2018-01-01' ) , /* a NULL,b過去 結果:b */
17 ( 15 , 'a' , NULL , 'b' , '2019-03-13' ) , /* a NULL,b当日 結果:b */
18 ( 16 , 'a' , NULL , 'b' , '2020-01-01' ) , /* a NULL,b未来 結果:NULL */
19 ( 17 , 'a' , '2018-01-01' , 'b' , NULL ) , /* b NULL,a過去 結果:a */
20 ( 18 , 'a' , '2019-03-13' , 'b' , NULL ) , /* b NULL,a当日 結果:a */
21 ( 19 , 'a' , '2020-01-01' , 'b' , NULL ) , /* b NULL,a未来 結果:NULL */
22 ( 20 , 'a' , NULL , 'b' , NULL ) ; /* 両方 NULL 結果:NULL */
検索
SQL
1 select code , case
2 when date_a <= '2019-03-13' and date_b is null then license_a
3 when date_a > '2019-03-13' and date_b is null then null
4 when date_b <= '2019-03-13' and date_a is null then license_b
5 when date_b > '2019-03-13' and date_a is null then null
6 when date_a is null and date_b is null then null
7 when date_a <= '2019-03-13' and date_b <= '2019-03-13' and date_a < date_b then license_b
8 when date_a <= '2019-03-13' and date_b <= '2019-03-13' and date_a >= date_b then license_a
9 when date_a <= '2019-03-13' and date_b >= '2019-03-13' then license_a
10 when date_a >= '2019-03-13' and date_b <= '2019-03-13' then license_b
11 when date_a >= '2019-03-13' and date_b >= '2019-03-13' then null
12 end as lincese
13 from tbl
結果
b-a-a-b-a-NULL-NULL-NULL-a-a-b-b-a-b-b-NULL-a-a-NULL-NULL
まとめると
SQL
1 select code , case
2 when least ( coalesce ( date_a , '9999-12-31' ) , coalesce ( date_b , '9999-12-31' ) ) > '2019-03-13' then null
3 when not ( coalesce ( date_a , '1900-01-01' ) >= coalesce ( date_b , '1900-01-01' ) ) = ( '2019-03-13' >= greatest ( coalesce ( date_a , '1900-01-01' ) , coalesce ( date_b , '1900-01-01' ) ) ) then license_b
4 else license_a
5 end as lincese
6 from tbl
7
coalesceはnvlでもいけるかも
※oracleでは0年駄目なんですね?1900年に換えときました
※XORを別式に換えました