Как изменить порядок сортировки столбца после изменения порядка сортировки строк - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть таблица с множеством строк, и вызов столбца «порядок», который идет от 1 до XX, зависит от того, сколько строк у меня в таблице.

Дело в том, что если я хочу переместить строку с «ордером» 1 в позицию 3, мне нужен другой «ордер» из другой строки, чтобы изменить порядок.

Например, если я переместу «порядок» 1 с «3», все число после будет увеличиваться на 1, а второе должно быть «порядок» 1 сейчас.

Надеюсь, я был чист.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ / ОБРАЗЕЦ ДАННЫХ

Name   |  Order
Line 1 |  1
Line 2 |  2
Line 3 |  3
Line 4 |  4

Если я обновлю порядок «Строка 1» с 4 вместо 1, я хочу, чтобы другие обновили свой порядок!

Name   |  Order
Line 2 |  1
Line 3 |  2
Line 4 |  3
Line 1 |  4

То же самое, если я обновлю порядок "строки 4" с 1!

Name   |  Order
Line 4 |  1
Line 1 |  2
Line 2 |  3
Line 3 |  4

То же самое, если я обновлю порядок "строки 3" с 2, например!

Name   |  Order
Line 1 |  1
Line 3 |  2
Line 2 |  3
Line 4 |  4

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать оператор CASE:

UPDATE ...
SET [Order] = [Order] + CASE
  WHEN [Order] = @OLDPOS THEN @NEWPOS - @OLDPOS
  WHEN @NEWPOS > @OLDPOS AND [Order] > @OLDPOS AND [Order] <= @NEWPOS THEN -1
  WHEN @NEWPOS < @OLDPOS AND [Order] < @OLDPOS AND [Order] >= @NEWPOS THEN 1
  ELSE 0
END

Вот некоторые тесты

Пробелы и перекрытия можно исправить, добавив ROW_NUMBER() квыше.

Некоторые тесты на моар

0 голосов
/ 18 сентября 2018

Попробуйте этот подход

DECLARE @tbl TABLE([Name] VARCHAR(100),[Order] INT);
INSERT INTO @tbl VALUES
 ('Line 1',1) 
,('Line 2',2) 
,('Line 3',3)
,('Line 4',4);

DECLARE @OldPos INT=3, @NewPos INT=2;

WITH cte AS
(
    SELECT [Name]
          ,[Order]
          ,ROW_NUMBER() OVER(ORDER BY CASE WHEN [Order]=@OldPos 
                                           THEN CAST(@NewPos AS FLOAT) 
                                                + CASE WHEN @OldPos<@Newpos 
                                                       THEN 0.5 ELSE -0.5 END 
                                           ELSE CAST([Order] AS FLOAT) END) AS ComputedPos 
    FROM @tbl 
)
UPDATE cte SET [Order] = ComputedPos
WHERE [Order]<>ComputedPos;

SELECT * FROM @tbl ORDER BY [Order];

При этом используется обновляемый CTE . Комментарий Damian_The_Unbeliever дал мне идею без необходимости изменять тип данных заказа.

Функция ROW_NUMBER выполнит некоторые вычисления в своем предложении OVER. Если [Order] имеет правильное входное значение, мы установим новую позицию между новыми соседями, добавив 0.5 или -0.5 к новой позиции. Это зависит от направления , в котором вы двигаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...