PostgreSQL的。如何更新满足WHERE条件的从0到最后一行的整数范围的列

时间:2018-05-07 15:50:01

标签: postgresql postgresql-9.5

我有一个名为userz的下一个表格示例:

+----+---------------+----------+
| id | sort_position | type     |
+----+---------------+----------+
|  1 |            -5 | admin    |
|  2 |            -3 | customer |
|  3 |             1 | customer |
|  4 |             8 | employee |
|  5 |           200 | customer |
+----+---------------+----------+

使用Mysql如果我想让所有sort_position类型的customer从0开始,++直到满足WHERE条件的最后一行,我可以做下一个:

SET @i=-1; 
UPDATE userz 
SET sort_position=@i:=@i+1 
WHERE type = "customer" ORDER BY sort_position;

我将收到预期的结果:

+----+---------------+----------+
| id | sort_position | type     |
+----+---------------+----------+
|  1 |            -5 | admin    |
|  2 |             0 | customer |
|  3 |             1 | customer |
|  4 |             8 | employee |
|  5 |             2 | customer |
+----+---------------+----------+

如您所见,现在为所有客户分配了正确的sort_position 0,1,2

但是因为我正在使用postgre,所以我需要与它相同。到目前为止我尝试了什么:

DO $$
DECLARE  
   i integer := -1;   
BEGIN  
   UPDATE userz 
   SET sort_position=@i:=@i+1 
   WHERE type = "customer" ORDER BY sort_position;
END $$;

我在=@i:=@i+1附近遇到错误,尝试了不同的格式,我用Google搜索了=i:=i+1,但仍然没有运气。

1 个答案:

答案 0 :(得分:0)

尝试以下SQL;

update userz k
set sort_position = 
     (select ROW_NUMBER() over(order by sort_position)-1 rnum
         from userz src
        where src.type ='customer'
          and id = k.id)