Это сложное требование, поскольку оно включает в себя несколько обновлений, которые зависят друг от друга, и порядок этих обновлений не гарантируется.
Сначала обновите все остальные строки, которые необходимо обновить, кроме строки человека, которого вы хотите переместить:
with cte as (
select name, order_index current_index, ? new_index
from persons
where name = 'Muhammed'
)
update persons
set order_index = order_index +
case
when (select current_index from cte) > (select new_index from cte) then 1
else -1
end
where name <> (select name from cte)
and order_index between
min((select current_index from cte), (select new_index from cte))
and
max((select current_index from cte), (select new_index from cte));
Затем обновите строку человека, которого вы хотите переместить:
update persons
set order_index = ?
where name = 'Muhammed';
Замените заполнители ?
в обоих запросах на новую позицию. См. Демонстрацию .