如何修改WITH CTE AS语句,实现含空白Customer的StackCustomerAltID有序更新
空白值排序问题解决方案
要实现非空Customer记录排序在前、空白Customer记录排序在后的效果,只需要调整窗口函数中ORDER BY的排序规则即可,核心是通过条件判断给空白记录设置更低的排序优先级。
如果你的需求还是仅更新DelFlg=0的记录,不要删除WHERE子句中的DelFlg=0条件,仅移除Customer <> ''的过滤条件即可。
修改后的完整代码如下:
WITH CTE AS( SELECT StackCustomerAltID, ROW_NUMBER() OVER ( ORDER BY -- 非空Customer记录优先排序 CASE WHEN Customer IS NULL OR Customer = '' THEN 1 ELSE 0 END, Customer ASC ) AS RN FROM dbo.StackCustomer WHERE DelFlg = 0 -- 保留原逻辑中仅更新未删除记录的限制,不需要可删除 ) UPDATE CTE SET StackCustomerAltID = RN;
代码逻辑说明
CASE WHEN Customer IS NULL OR Customer = '' THEN 1 ELSE 0 END会将所有非空的Customer记录标记为0,空白(含NULL值和空字符串)记录标记为1,排序时0在前1在后,保证所有非空记录排在空白记录前面- 非空记录内部仍按原有逻辑以Customer字段升序排序
- 空白记录之间的排序顺序如果有自定义要求,可以在ORDER BY最后追加对应字段规则,比如按主键ID升序就加
, ID ASC即可
内容的提问来源于stack exchange,提问作者JShaffer
相关产品推荐
相关产品推荐

