MySQL单查询实现带LIMIT与无LIMIT两种场景是否可行?
单个MySQL查询实现分页/全量查询的方案
完全可以实现,不用写两个独立的查询语句,通过动态处理LIMIT的参数就能同时满足两种场景:
- 当传入
startingRow和rowsCount参数时,执行分页查询 - 未传入参数时,返回全量数据
具体实现代码
利用COALESCE函数(或IFNULL)处理参数,当参数为NULL时替换成能覆盖全量数据的默认值:
SELECT * FROM CUSTOMER.CUSTOMER LIMIT COALESCE(:startingRow, 0), COALESCE(:rowsCount, 18446744073709551615);
或者用IFNULL的等价写法:
SELECT * FROM CUSTOMER.CUSTOMER LIMIT IFNULL(:startingRow, 0), IFNULL(:rowsCount, 18446744073709551615);
逻辑说明
COALESCE(:startingRow, 0):如果传入了startingRow就用它的值,没传就用0作为起始行COALESCE(:rowsCount, 18446744073709551615):如果传入了rowsCount就用它的值,没传就用MySQL无符号BIGINT的最大值,这个数值远大于绝大多数表的总行数,相当于返回所有数据
注意事项
- 确保参数
startingRow和rowsCount是数值类型,避免类型转换报错 - 如果使用ORM框架(如MyBatis),要确认参数未传入时会被设置为
NULL,这样上述逻辑才能正常触发
内容的提问来源于stack exchange,提问作者Jayashri Shinde
相关产品推荐
相关产品推荐

