本帖最后由 blueshuzi 于 2012-12-12 16:53 编辑
rt
如果是像表tmp_suu 的数据的话 要求查询结果: 去除重复值,并且按照从小到大的顺序排列 。
正确结果 应该是001,002,004
数据
SQL> select * from tmp_suu;
VV
----
001
001
002
004
002
004
001
004
我使用了COLLECT进行收集和排序处理
结果虽然排序了,但是没有去除重复
SQL> SELECT concat_array(CAST(COLLECT(DISTINCT u.vv ORDER BY
2
u.vv) AS strarray),
3
',')
4FROM tmp_suu u;
CONCAT_ARRAY(CAST(COLLECT(DIST
--------------------------------------------------------------------------------
001,001,001,002,002,004,004,004
如果去掉 ORDER BY部分,就可以去除重复数据
SQL>
SQL> SELECT concat_array(CAST(COLLECT(DISTINCT u.vv) AS strarray),
2
',')
3FROM tmp_suu u;
CONCAT_ARRAY(CAST(COLLECT(DIST
--------------------------------------------------------------------------------
001,002,004
想问下,为什么加上order by 就不能去除重复了呢?
应该怎么做才能得出正确的查询结果呢。
希望sql尽量简单点,因为真实表数据量很大。
strarray 是个简单的 varchar2 table 类型
CREATE OR REPLACE TYPE "STRARRAY"AS TABLE OF VARCHAR2(4000 BYTE);
concat_array 是将 strarray 转成 VARCHAR2 输出的一个函数
代码如下
CREATE OR REPLACE FUNCTION concat_array(i_strarrayIN strarray,
i_delimiter IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2 IS
l_str VARCHAR2(4000);
BEGIN
IF i_strarray IS NULL OR i_strarray.COUNT = 0 THEN
RETURN '';
END IF;
l_str := i_strarray(1);
FOR i IN 2 .. i_strarray.COUNT LOOP
l_str := l_str || i_delimiter || i_strarray(i);
END LOOP;
RETURN l_str;
END concat_array;
当前db版本
Release 11.2.0.2.0
|