Informix与db2排序时null值处理
客户的数据库从db2迁移到gbase 8t/informix,在测试存储过程中,发现存储过程能正常执行,但结果却是不正确的。
按存储过程中的SQL语句逐条执行对比,发现在使用到
SELECT ROW_NUMBER()OVER(PARTITION BY FID ORDER BY MID) AS PX,MID,FID FROM FTAB
时,结果出现不一致。
db2的结果是
PX MID FID
1 M1 F1
1 M2 F2
2 F21
3 F22
4 F23
1 M3 F3
2 F32
3 F33
8t/informix的结果是
px mid fid
1 M1 F1
1 F2
2 F21
3 F22
4 M2 F23
1 F3
2 F32
3 M3 F33
两者明显的区别就是null的前后放置顺序。即两个数据库order by排序时对null值的默认处理方式不同:db2是null值为后,8t/informix是null值优先。
为了正常迁移,可通过指定order by排序时null值的处理方式nulls last/nulss first 以达到预期的需求。将该语句改成
SELECT ROW_NUMBER()OVER(PARTITION BY FID ORDER BY MID NULLS LAST) AS PX,MID,FID FROM FTAB