Вы хотите, чтобы все строки удовлетворяли первому условию, но если ни одна строка не соответствует, тогда вы хотите, чтобы все строки удовлетворяли второму условию.
Я бы адресовал это с помощью предложения об ограничении строк (доступно начиная с версии 12 c):
select *
from mytable
where 'ABC' in (col1, col2)
order by rank() over(order by case col1 = 'ABC' then 1 else 2 end)
fetch first 1 row with ties
Это более эффективно, чем union all
, потому что не требует двух сканирований таблицы.