Один из вариантов - это условная сортировка, основанная на количестве не- null
значений в каждой строке, а затем предложение, ограничивающее строку (доступно с Oracle 12 c). Предполагая, что 3 столбца, допускающие значение NULL: col1
, col2
и col3
, это будет:
select *
from mytable
order by
case when col1 is null then 0 else 1 end
+ case when col2 is null then 0 else 1 end
+ case when col3 is null then 0 else 1 end desc
fetch first row with ties
Если вы используете старую версию Oracle, вы можете получить тот же результат с оконной функцией rank()
:
select *
from (
select
t.*,
rank() over(order by
case when col1 is null then 0 else 1 end
+ case when col2 is null then 0 else 1 end
+ case when col3 is null then 0 else 1 end desc
) rn
from mytable t
) t
where rn = 1