问题场景:用户提出需求,想在查询列表上实现多字段排序效果,其中字段有日期类型字符类型和数值类型,三个字段含有空值。按照条件查询的分页方法之前其他人已经写好并验证功能。
问题分析:oracle在排序时默认null值最大,如果多个关键字按照降序排列,那展示在第一页的列表数据就会有很多关键字都是空值,这肯定不符合用户期望。
解决思路:个人解决思路是在分页查询结果集不为空的情况下,通过case when函数把字段中的空值按排序要求转换成最大值和最小值,获取结果集之后在代码里将其转换回去。
sql逻辑如下所示,其中ROWNUM 和ROW_ID 用于分页使用,ROWNUM <= 分页最大值,ROW_ID >分页最小值-1,比如每页10,查找第二页数据,那就是从11到20,ROW_ID >10,ROWNUM <=20。当然我们也可以在QueryWrapper中使用.last拼接sql语句,如果有其他更快更好的方法希望大家多多指正。
SELECT
*
FROM
(
SELECT
TMP.*,
ROWNUM ROW_ID
FROM
(
SELECT
*
FROM
(
SELECT
FID AS id,
CASE WHEN FBENE_OWNER_CERT_VALID_DATE IS NULL THEN DATE '2000-01-01'
ELSE FBENE_OWNER_CERT_VALID_DATE END AS beneOwnerCertValidDate,
FBENE_OWNER_CERT_NO AS beneOwnerCertNo,
FAML_LEDGER_ID AS amlLedgerId,
FBENE_OWNER AS beneOwner,
FBENE_OWNER_CERT_TYPE beneOwnerCertType,
FBENE_OWNER_ADDRESS AS beneOwnerAddress
FROM
T_CUST_AML_LEDGER_BENEFICIARY
) a
ORDER BY
a.beneOwnerCertValidDate DESC,
a.beneOwnerCertNo DESC
) TMP
WHERE
ROWNUM <= 10
)
WHERE
ROW_ID > 0