比如一个表有下面字段
A B C
1 5 6
4 6 5
3 7 5
。。。。。
后面还有很多数据
我要查询结果B字段横着显示
567。。。。
估计直接SQL语句写不出来?
用PLSQL写呢?怎么写
DBMS_OUTPUT.PUTLINE都是竖着显示的,
我要横着显示。。
位大哥不要说用where,case..when,decode这些哈,这个如果有一万条数据,那我要写一万个条件?还要去看这一万个字段里面的内容?
------解决方案--------------------
用游标写的,您看对不对
- SQL code
create table a (B number(10));beginfor i in 1..50 loop insert into a values(i);end loop;end;/declaress varchar2(32767);CURSOR cur isselect B from a;beginfor i in cur loop ss:= ss||i.B||' ';end loop;dbms_output.put_line(ss);end;/
------解决方案--------------------
這樣?
- SQL code
WITH t AS(SELECT 1 A,5 B,6 C FROM DUALUNION ALLSELECT 4,6,5 FROM DUALUNION ALL SELECT 3,7,5 FROM DUAL)SELECT REPLACE(WM_CONCAT(B),',','')AS B FROM T;output:B567
------解决方案--------------------
只要B字段的數據橫著顯示而已?還是必須生成多個字段?
如果是後者要複雜些的存儲,如果是前者的需求,直接wm_concat?
- SQL code
WITH t AS(SELECT 1 A,5 B,6 C FROM DUALUNION ALLSELECT 4,6,5 FROM DUALUNION ALL SELECT 3,7,5 FROM DUAL)SELECT REPLACE(WM_CONCAT(B),',','')AS B FROM T;output:B567
------解决方案--------------------
prompt
prompt Creating type STRCAT_TYPE
prompt =========================
prompt
create or replace type strcat_type as object
(
cat_string varchar2(4000),
--对象初始化
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)
return number,
--聚合函数的迭代方法(这是最重要的方法)
member function ODCIAggregateIterate(self In Out strcat_type,
value in varchar2) return number,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
member function ODCIAggregateMerge(self In Out strcat_type,
ctx2 In Out strcat_type) return number,
--终止聚集函数的处理,返回聚集函数处理的结果
member function ODCIAggregateTerminate(self In Out strcat_type,
returnValue Out varchar2,
flags in number)
return number
)
/
prompt
prompt Creating type body STRCAT_TYPE
prompt ==============================
prompt
create or replace type body strcat_type is
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
is
begin
cs_ctx := strcat_type( null );
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN varchar2 )
return number
is
begin
/*字符串已','分割 */
self.cat_string := self.cat_string || ','|| value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN Out strcat_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
/*去除空(is null)*/
returnValue := ltrim(rtrim(self.cat_string,','),',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN Out strcat_type)
return number
is
begin
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
return ODCIConst.Success;
end;
end;
/
prompt
prompt Creating function FUNC_STRCAT
prompt =============================
prompt
CREATE OR REPLACE FUNCTION func_strcat(input varchar2) RETURN varchar2 -- 返回值
PARALLEL_ENABLE
AGGREGATE USING strcat_type;