sql学习积累——将查询结果行转列

将查询多条记录合并为一条记录(方法一)

  wmsys.wm_concat(gljs)

wmsys.wm_concat 主要功能是将查询结果行转列,每行结果用’,'分割
针对表中存在一对多关系时,可以用一条结果展示关系为一的结果信息,例如订单表

如果要获取订单表t_user_order表(表结构自己脑补)中用户A的所有订单,结果需要一行展示
select uo.name,wmsys.wm_concat(order_id) from t_user_order

用户 订单
A 订单id1,订单id2,订单id3…

用此方法进行行专列时会存在转换后列结果长度过长报错的问题!!!

将查询多条记录合并为一条记录(方法二)

  rtrim(XMLAGG(XMLELEMENT(E,menu.name ||'、')).EXTRACT('//text()').getclobval(), '、')

此方法可以避免转换后长度过长报错问题;因为此方法是将结果转为clob,对长度没什么限制。而且可以自定义分隔符


详解 sql中各函数作用(Oracle XMLTable函数)

  • XMLELEMENT(E,menu.name ||’、’)

对oracle里字段生成xml语句,其中E定义的为xml节点名,后面的为表中字段名。
这样就生成了clob格式的xml语句

SELECT XMLELEMENT("Emp", XMLELEMENT("Name", e.job_id||' '||e.last_name),
   XMLELEMENT("Hiredate", e.hire_date)) as "Result" FROM employees e 
   WHERE employee_id > 200;
   
查询结果为:
	<Emp>
  		<Name>MK_MAN Hartstein</Name>
 		 <Hiredate>2004-02-17</Hiredate>
	</Emp>
  • XMLAGG(XMLELEMENT(E,menu.name ||’、’))

XMLAgg是一个聚合函数。它采用XML片段的集合并返回聚合的XML文档。从结果中删除任何返回null的参数。

SELECT XMLELEMENT("Department",
   XMLAGG(XMLELEMENT("Employee", 
   e.job_id||' '||e.last_name)
   ORDER BY last_name))
   as "Dept_list"     
   FROM employees e
   WHERE e.department_id = 30;

查询结果
-------------------------------------------------------------
<Department>
  <Employee>PU_CLERK Baida</Employee>
  <Employee>PU_CLERK Colmenares</Employee>
  <Employee>PU_CLERK Himuro</Employee>
  <Employee>PU_CLERK Khoo</Employee>
  <Employee>PU_MAN Raphaely</Employee>
  <Employee>PU_CLERK Tobias</Employee>
</Department>
  • EXTRACT()

Oracle提供对XML文件的检索功能(extractvalue),extractvalue只能返回一个节点的一个值

如果想查询所有subfield的值就要用到extract(),它可以返回一个节点下的所有值。

  • getclobval()

用来读取XML

  • rtrim(’…,’、’)
  • 用来去除字符串最右端指定字符

你可能感兴趣的:(sql学习)