如何按1,2,3循环模式更新表中DesiredResultAfterUpdate列?
解决按ID分组循环赋值1、2、3的问题
嘿,我来帮你搞定这个循环赋值的需求!你要的是让DesiredResultAfterUpdate列按照ID每3个一组重复1、2、3的序列,之前的方法只对每第3条数据生效,大概率是取余逻辑没处理好——毕竟当ID是3的倍数时,直接取余会得到0,而不是你要的3。
下面分几种常见数据库给你具体的解决方案:
情况1:ID是连续递增的
如果你的ID是连续没有缺失的(比如1、2、3、4、5、6...),直接用取余+CASE判断就能搞定:
MySQL/MariaDB
UPDATE your_table_name SET DesiredResultAfterUpdate = CASE WHEN MOD(ID, 3) = 0 THEN 3 ELSE MOD(ID, 3) END;
SQL Server
UPDATE your_table_name SET DesiredResultAfterUpdate = CASE WHEN ID % 3 = 0 THEN 3 ELSE ID % 3 END;
PostgreSQL
UPDATE your_table_name SET DesiredResultAfterUpdate = CASE WHEN MOD(ID, 3) = 0 THEN 3 ELSE MOD(ID, 3) END;
执行完更新后,你可以用这条语句验证结果:
SELECT ID, DesiredResultAfterUpdate FROM your_table_name ORDER BY ID;
应该会得到ID1→1,ID2→2,ID3→3,ID4→1,ID5→2,ID6→3...这样的序列。
情况2:ID存在缺失(不连续)
如果你的ID不是连续的(比如有1、2、4、5、7这种情况),想要按数据的排序顺序来分组循环,就得用窗口函数生成连续的行号,再对行号取余:
MySQL 8.0+/SQL Server/PostgreSQL
UPDATE your_table_name t JOIN ( SELECT ID, CASE WHEN MOD(ROW_NUMBER() OVER (ORDER BY ID), 3) = 0 THEN 3 ELSE MOD(ROW_NUMBER() OVER (ORDER BY ID), 3) END AS new_value FROM your_table_name ) sub ON t.ID = sub.ID SET t.DesiredResultAfterUpdate = sub.new_value;
这里ROW_NUMBER() OVER (ORDER BY ID)会按照ID的顺序生成连续的1、2、3、4...序号,再对这个序号做取余处理,就能保证不管ID有没有缺失,都能按顺序循环1、2、3。
内容的提问来源于stack exchange,提问作者Иво Недев
相关产品推荐
相关产品推荐

