CASE WHEN must return a value, not a statement. Why just not user simple logical AND/OR statements? :) For example, the first query can be rewritten like this:
WITH t(val) AS
( SELECT 1 FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual
UNION ALL
SELECT 5 FROM dual
)
SELECT *
FROM t
WHERE (i_check = 'Y' AND VAL >= 3)
OR (i_check = 'N' AND VAL > 3);
As for the second query, it should be something like this:
WITH t(val) AS
( SELECT trunc(sysdate) FROM dual
UNION ALL
SELECT trunc(sysdate) + interval '10' minute FROM dual
UNION ALL
SELECT trunc(sysdate) + interval '1' hour FROM dual
UNION ALL
SELECT trunc(sysdate) + interval '2' hour + interval '1' second FROM dual
UNION ALL
SELECT trunc(sysdate) + 1 FROM dual
)
SELECT *
FROM t
WHERE (:i_check = 'Y' AND VAL >= :i_date)
OR (:i_check = 'N' AND VAL > :i_date)