如何解决Oracle数据库listagg函数中ORDER BY排序失效的问题
问题根因
你遇到的排序未生效问题是Oracle查询执行顺序导致的:ROWNUM 过滤的执行优先级高于 listagg 函数内的排序逻辑,当前语句会先取符合 user = '11111' 条件的前3条数据(取数逻辑无排序规则,结果随机),再对这3条数据做排序拼接,自然无法得到全局排序后的预期结果。
另外你给出的第二条查询语句存在语法错误:user = '11111'' 多了一个多余的单引号,执行时会直接报错,调整时请先删除多余的单引号。
正确写法
先通过子查询对全量符合条件的数据完成排序,再截取前3行执行聚合即可:
SELECT listagg(NUMBER, ', ') WITHIN GROUP (ORDER BY LENGTH(NUMBER) ASC) AS MANY_NUMBERS FROM ( SELECT NUMBER FROM myNumbers WHERE user = '11111' ORDER BY LENGTH(NUMBER) ASC ) WHERE ROWNUM < 4;
内容的提问来源于stack exchange,提问作者Evg
相关产品推荐
相关产品推荐

