Oracle中如何获取列的唯一数据长度并以逗号分隔拼接
报错原因分析
- 第一个错误
ORA-00936:LISTAGG函数第一个参数要求是列名/表达式,不能直接嵌套独立的SELECT子查询,同时原代码的括号、别名位置也存在语法错误 - 第二个错误
ORA-30482:你使用的Oracle版本低于12cR2,该版本之前的LISTAGG不支持直接加DISTINCT参数,无法直接对聚合的值去重
正确实现方案
通用兼容方案(支持所有Oracle版本)
先通过子查询完成长度计算、过滤、去重操作,外层再做字符串拼接,没有版本限制:
SELECT LISTAGG(len_val, ',') WITHIN GROUP (ORDER BY len_val) AS result_str FROM ( SELECT DISTINCT LENGTH(ColumnName) AS len_val FROM TableName WHERE LENGTH(ColumnName) NOT BETWEEN 6 AND 10 );
高版本简化方案(仅Oracle 12cR2及以上版本可用)
如果你的数据库版本足够高,可以直接用LISTAGG支持DISTINCT的语法:
SELECT LISTAGG(DISTINCT LENGTH(ColumnName), ',') WITHIN GROUP (ORDER BY LENGTH(ColumnName)) AS result_str FROM TableName WHERE LENGTH(ColumnName) NOT BETWEEN 6 AND 10;
使用时请替换代码中ColumnName为目标列名、TableName为实际表名即可。
内容的提问来源于stack exchange,提问作者Venkatesh R
相关产品推荐
相关产品推荐

