1

テーブルに「SortIndex」列があり、ID と選択したテーブルの新しい位置を渡してそのテーブルを並べ替える「ケース更新」を追加したいと思います。

SQL フィドル

DECLARE @T TABLE
(
    ID int,
    Name char(1),
    SortIndex int
)

INSERT @T 
SELECT 21, 'A', 1 UNION ALL
SELECT 23, 'B', 2 UNION ALL
SELECT 35, 'C', 3 UNION ALL
SELECT 45, 'D', 4 UNION ALL
SELECT 55, 'E', 5

SELECT * FROM @T    

DECLARE @SortIndex int

/* MOVE A -> 4 */

SET @SortIndex = (SELECT SortIndex FROM @T WHERE ID = 23)

/*
UPDATE @T
    SET 
        SortIndex = CASE ... ??
*/      

/* MOVE D -> 2 */

SELECT * FROM @T

caseステートメントのみを使用してソートインデックスを再構築することでこれを解決することは可能ですか?

アップデート

望ましい結果

A -> 4

    Name SortIndex
    B     1 
    C     2
    D     3
    A     4
    E     5

    D -> 2

    A     1 
    D     2
    B     3
    C     4
    E     5
4

2 に答える 2

2

次のコードを使用してインデックスを移動および再構築します。目的の要素の後に要素を追加し、他の要素をシフトします (コメントの説明に基づく回答)。

これはよりスリムなバージョンです:

 DECLARE @SortIndex int,@MoveTo int, @CurrentSortIndex int

SET @CurrentSortIndex  = (SELECT SortIndex FROM @T WHERE ID = 45) --D
SET @MoveTo = 2

UPDATE--D
  @T
SET
  SortIndex = @MoveTo
WHERE
  ID = 45

UPDATE
  @T
SET
  SortIndex = SortIndex - ((@MoveTo-@CurrentSortIndex)/(ABS(@MoveTo-@CurrentSortIndex)))
WHERE
(
    SortIndex BETWEEN @CurrentSortIndex AND @MoveTo
 OR
    SortIndex BETWEEN @MoveTo AND @CurrentSortIndex  
)
AND
  ID != 45

A を位置 2 に移動する完全な例、また sqlfiddle リンクhttp://sqlfiddle.com/#!3/d41d8/5918 :

DECLARE @T TABLE
(
    ID int,
    Name char(1),
    SortIndex int
)

INSERT @T 
SELECT 21, 'A', 1 UNION ALL
SELECT 23, 'B', 2 UNION ALL
SELECT 35, 'C', 3 UNION ALL
SELECT 45, 'D', 4 UNION ALL
SELECT 55, 'E', 5


DECLARE @SortIndex int,@MoveTo int, @CurrentSortIndex int
DECLARE @IDToMove INT 
SET @IDToMove = 21--A

SET @CurrentSortIndex  = (SELECT SortIndex FROM @T WHERE ID = @IDToMove) 
SET @MoveTo = 2

UPDATE
  @T
SET
  SortIndex = @MoveTo
WHERE
  ID = @IDToMove

UPDATE
  @T
SET
  SortIndex = SortIndex - ((@MoveTo-@CurrentSortIndex)/(ABS(@MoveTo-@CurrentSortIndex)))
WHERE
(
    SortIndex BETWEEN @CurrentSortIndex AND @MoveTo
 OR
    SortIndex BETWEEN @MoveTo AND @CurrentSortIndex  
)
AND
  ID != @IDToMove

SELECT * FROM @T ORDER BY SortIndex

初期バージョン:

DECLARE @SortIndex int,@MoveTo int, @CurrentSortIndex int

SET @CurrentSortIndex  = (SELECT SortIndex FROM @T WHERE ID = 21) --A
SET @MoveTo = 2

UPDATE--A
  @T
SET
  SortIndex = @MoveTo
WHERE
  ID = 21

IF @MoveTo > @CurrentSortIndex

UPDATE
  @T
SET
  SortIndex = SortIndex - 1
WHERE
  SortIndex BETWEEN @CurrentSortIndex AND @MoveTo
AND
  ID != 21

 IF @MoveTo < @CurrentSortIndex

UPDATE
  @T
SET
  SortIndex = SortIndex + 1
WHERE
  SortIndex BETWEEN @MoveTo AND @CurrentSortIndex
AND
  ID != 21
于 2012-11-06T15:56:21.607 に答える
0
UPDATE @T
SET SortIndex = CASE Name 
        when 'A' then 4 
        when 'D' then 2 
        else Name 
    end
于 2012-11-06T15:27:24.493 に答える