In the absence of anything else, they will be identical in terms of performance.
SQL> create table t tablespace largets
2 as select d.*,
3 case when mod(object_id,5) != 0 then 0 else 1 end flag,
4 case when mod(object_id,5) != 0 then created else null end end_Date
5 from dba_objects d,
6 ( select 1 from dual
7 connect by level <= 100 );
Table created.
SQL> set timing on
SQL> select count(*) from t where flag = 1;
COUNT(*)
----------
1729700
Elapsed: 00:00:00.61
SQL> select count(*) from t where end_date is null;
COUNT(*)
----------
1729700
Elapsed: 00:00:00.60
Where matters more is the volume of rows of interst, and whether is it then worth indexing them etc. In the case above, 1.7million rows are returned so an index is *unlikely* to be useful.
If it was just a small amount of rows, I could index the data so that only the rows I want are present in the index, eg
create index IX1 on t ( end_date ) -- only picks up the rows with a non-null end date
create index IX2 on t ( case when flag = 1 then 1 end ) -- only picks up the rows with a 1 for flag.
Similarly, depending on requirements, you could explore partitioning