Возможно, я ошибаюсь, но, похоже, в этом случае вам не нужно иметь одно решение только для утверждения. Я также не подразумеваю, что это подразумевалось, поскольку вы говорили только о инструкции UPDATE, что не означает, что у вас не может быть никаких других инструкций, готовящих ваше обновление, не так ли? Но если у вас есть это в виду, простите меня, пожалуйста, но я собираюсь двигаться дальше. :)
Во-первых, я хотел бы знать, действительно ли у вашего Column_Order
нет пробелов. Потому что, если нет пробелов и значения начинаются с 1, то вы можете уйти с раствором cyberkiwi с только этой модификации (но все кредит должен пойти к этому человеку):
declare @order int;
set @order = :order;
update P_Columns
set Column_Order =
case
when Column_Order = @order then Column_Order - 1
else Column_Order + 1
end
where Column_Order in (@order, @order - 1) and @order > 1
То есть, вам нужно объявите @var, поэтому вы используете только :order
один раз для каждого скрипта. (Возможно, вы, наверное, уже это знали.) И вот вы.
Однако, если это решение не может быть применено как есть, то в основном, я думаю, вам просто нужно добавить еще несколько операторов для вычисления другого значения заказа из-за его замены, а затем обновления.
Вот что это может быть, как:
declare @order int, @prev_order int;
set @order = :order;
/* here goes looking up for the other Column_Order */
select @prev_order = max(Column_Order)
from P_Columns
where Column_Order < @order;
/* and now update, which is basically the same,
only adapted for use with @prevorder,
and also we check if @prevorder has a value */
if @prevorder is not null
update P_Columns
set Column_Order =
case Column_Order
when @order then @prevorder
else @order
end
where Column_Order in (@order, @prevorder)
Если у вас есть какие-либо вопросы, они приветствуются.
С каким dbms это соединение? – RichardTheKiwi