代码之家  ›  专栏  ›  技术社区  ›  Mahajan344

基于SQL Server中的新/旧值更新其他记录的优先级

  •  2
  • Mahajan344  · 技术社区  · 8 年前

    我有一个SQL Server表,其中一列名为 Priority ( int )值从1到n。

    E、 g.我有以下6项记录 优先事项 列:

    Col1 | Priority
    -----+----------
    val1 | 1
    val2 | 2
    val3 | 3
    val4 | 4
    val5 | 5
    val6 | 6
    

    现在,如果我想更改2的第6条记录的优先级,那么在2之后,所有记录的优先级应该增加1。所以输出将是

    Col1 | Priority
    -----+---------
    val1 | 1
    val6 | 2
    val2 | 3
    val3 | 4
    val4 | 5
    val5 | 6
    

    如何在T-SQL中执行此操作?

    4 回复  |  直到 8 年前
        1
  •  4
  •   jarlh    8 年前

    使用 case 表达式:

    update tablename
    set Priority = case when Priority = 6 then 2
                        when Priority > 1 then Priority + 1
                        else Priority
                   end
    
        2
  •  2
  •   Ilyes    8 年前

    您可以使用 CASE 表达式或 IIF() 如果您使用的是SQL Server 2012+:

    CREATE TABLE P (
        Col1 VARCHAR(25),
        Priority INT
        );
    INSERT INTO P VALUES
    ('val1', 1),
    ('val2', 2),
    ('val3', 3),
    ('val4', 4),
    ('val5', 5),
    ('val6', 6);
    
    UPDATE P
    SET Priority = IIF(Priority = 6, 2, IIF(Priority = 1, 1, Priority + 1) );
    
    SELECT *
    FROM P
    ORDER BY Priority;
    

    输出:

    | Col1 | Priority |
    |------|----------|
    | val1 |        1 |
    | val6 |        2 |
    | val2 |        3 |
    | val3 |        4 |
    | val4 |        5 |
    | val5 |        6 |
    
        3
  •  1
  •   Ofir Winegarten    8 年前

    我想你会想要一个一般情况的答案(不是特别的6和2) 例如,如果要替换5和2,则不应增加优先级6。。。

    DECLARE @PrioriyToChange int = 6;
    DECLARE @NewPrioriy int = 2;
    update PriorityTable set prioirity = 
                    case when prioirity = @PrioriyToChange then @NewPrioriy
                         when prioirity between @NewPrioriy and @PrioriyToChange - 1 
                              then prioirity + 1
                         else prioirity
                    end
    
        4
  •  1
  •   Damien_The_Unbeliever    8 年前

    我建议你 Priority float 因此,除了特殊情况外,您始终可以计算任何现有相邻值对之间的新优先级值。

    E、 g.如果你 val6 s优先级 1.5 这样就不必更改任何其他行的值。

    偶尔(根据更新频率),您可以使用 ROW_NUMBER() 将值返回到 int s


    E、 g.重基查询(当优先级值变得太“精细”时)如下所示:

    declare @t table (Val char(4), Priority float)
    insert into @t (Val,Priority) VALUES
    ('val1',1),
    ('val6',1.5),
    ('val2',2)
    
    ;With ForUpdate as (
        select *,ROW_NUMBER() OVER (ORDER BY Priority) as NewPri
        from @t
    )
    UPDATE ForUpdate SET Priority = NewPri
    select * from @t