SELECT userid||username FROM manager;SELECT concat(userid,username)FROM manager;
字符串转多行
SELECT'1'FROM dual unionallSELECT'2'FROM dual;
列转行 wm_concat()
droptable test;createtable test(id number,username varchar2(20));insertinto test values(1,'a');insertinto test values(1,'b');insertinto test values(1,'c');insertinto test values(2,'d');insertinto test values(2,'e');commit;--wm_concat函数默认是CLOB字段,当超过限制时,会报错ORA-22816:操作数值超出系统的限制select wm_concat(username)from test;--列转行,默认用,分隔--<CLOB>select TO_CHAR(wm_concat(username))from test;--转为varchar--a,b,c,d,eselect dbms_lob.substr(replace(wm_concat(username),',','|'))from test;--将,替换为|--a|b|c|d|e--实际上处理CLOB字段的时候,直接TO_CHAR,当长度超过4000的时候,会报错,提示列被截取;select dbms_lob.substr(wm_concat(username),4000)from test;--可以使用dbms_lob.substr(clobcolumn,4000),对CLOB字段进行截取;截取的长度是4000还是2000根据存储的是汉字和数据决定长度;select substr(wm_concat(username),0,4000)from test;--直接使用SUBSTR对CLOB字段进行截取,是不能起到任何作用的SELECT id, dbms_lob.substr(wm_concat(username))FROM test
groupby id;--按userid分组合并name11 a,c,b
22 d,e
;--扩展,拼接表字段select*from user_tab_columns;select dbms_lob.substr('create or replace view as select '||
wm_concat(column_name)||' from TEST',4000) sqlStr
from user_tab_columns
where table_name ='TEST';
行转列 pivot()
createtable demo(id int,name varchar(20),nums int);---- 创建表insertinto demo values(1,'苹果',1000);insertinto demo values(2,'苹果',2000);insertinto demo values(3,'苹果',4000);insertinto demo values(4,'橘子',5000);insertinto demo values(5,'橘子',3000);insertinto demo values(6,'葡萄',3500);insertinto demo values(7,'芒果',4200);insertinto demo values(8,'芒果',5500);commit;SELECT*FROM demo;11 苹果 100022 苹果 200033 苹果 400044 橘子 500055 橘子 300066 葡萄 350077 芒果 420088 芒果 5500;select name,sum(nums) nums from demo groupby name;select*from(select name, nums from demo)pivot(sum(nums)for name in('苹果','橘子','葡萄','芒果'));SELECT*FROM(select name, nums from demo)pivot(sum(nums)for name in(--SELECT wm_concat(distinct(name)) FROM demo -- ORA-00936:缺失表达式--SELECT distinct name FROM demo -- ORA-00936:缺失表达式'苹果','橘子','葡萄','芒果'));SELECT*FROM(select name, nums from demo)pivot xml (sum(nums)for name in(SELECTdistinct name FROM demo
));--A subquery is used only in conjunction with the XML keyword 子查询只能与关键字xml使用--<XMLTYPE><?xml version="1.0"?><PivotSet><item><column name="NAME">橘子</column><column name="SUM(NUMS)">8000</column></item><item><column name="NAME">芒果</column><column name="SUM(NUMS)">9700</column></item><item><column name="NAME">苹果</column><column name="SUM(NUMS)">7000</column></item><item><column name="NAME">葡萄</column><column name="SUM(NUMS)">3500</column></item></PivotSet>;pivot 行转列(聚合函数 for 列名 in(类型)) ,其中 in('') 中可以指定别名,in中还可以指定子查询
pivot 会隐式执行 groupby
当然也可以不使用pivot函数,等同于下列语句,只是代码比较长,容易理解
;select*from(selectsum(nums) 苹果 from demo where name ='苹果'),(selectsum(nums) 橘子 from demo where name ='橘子'),(selectsum(nums) 葡萄 from demo where name ='葡萄'),(selectsum(nums) 芒果 from demo where name ='芒果');