在oracle中将单行转换为单列

时间:2016-05-11 20:05:06

标签: oracle plsql

是否可以将此语句作为列而不是行返回?可能使用数据透视查询?

select * from MYTABLE Where SOMECOLUMN = RESULT THAT RETURNS ONE RECORD

2 个答案:

答案 0 :(得分:2)

为了您的目的,您可以创建一个动态SQl变量字符串并在存储过程中执行它,该变量应该连接在数据透视查询中所需的所有字段名称,就像我在此文本下面显示的那样。

作为示例,我们可以使用emp表,因为您可以看到我们只从表中提取了一行emp.name =' KING',然后我们使用UNPIVOT语句转置它。我们转置的列的名称是ENAME,JOB和EMPNO,但我们可以转置其他列。您必须将列转换为相同的数据类型,因为它们必须适合单个列,我在示例中使用了TO_CHAR(empno)。我在主选择中也返回了字段名称,但您可以省略它。希望它有所帮助。

select  fieldvalue,fieldname from (
    SELECT ename,job,to_char(empno) as empno
    FROM emp where emp.ename='KING'
    )
    UNPIVOT (fieldvalue FOR fieldname IN (ename as 'ENAME', job as 'JOB', empno as 'EMPNO'))
    order by fieldname ;

答案 1 :(得分:1)

我创建了一个简单的函数,它可以生成你想要的东西,它会返回一个表,因此你可以调用它:从TABLE(mypkg.RowToCol)中选择*,例如它将返回一行EMP表,其中EName是“ KING”。

create or replace PACKAGE mypkg AS
  TYPE ColTypRec IS RECORD (field_value varchar2(100),field_name Varchar2(100));
  TYPE ColTyp IS TABLE of ColTypRec;
end;

FUNCTION RowToCol RETURN ColTyp PIPELINED AS
c sys_refcursor;
col_tochar_names varchar(500);
col_names        varchar(500);
data             ColTypRec;
begin
--usage select * from TABLE(mypkg.RowToCol)
SELECT RTRIM (XMLAGG (XMLELEMENT (e, 'TO_CHAR('||column_name||') as '||column_name || ',')).EXTRACT ('//text()'),   ',') , 
       RTRIM (XMLAGG (XMLELEMENT (e, column_name || ',')).EXTRACT ('//text()'),   ',') 
       INTO  col_tochar_names, col_names
FROM USER_TAB_COLS WHERE table_name='EMP';
--dbms_output.put_line(col_tochar_names);
--dbms_output.put_line(col_names);
Open c for  'SELECT fieldvalue,fieldname from ( ' ||
            ' SELECT '||col_tochar_names ||
            ' FROM emp where emp.ename=''KING'' '||
            ' ) '||
            ' UNPIVOT INCLUDE NULLS (fieldvalue FOR fieldname IN ('||col_names||')) '||
            'order by fieldname';
LOOP
  FETCH c INTO data;
  EXIT  WHEN c%NOTFOUND;
  PIPE  ROW(data);  
END LOOP;
CLOSE c;
end;
end; --Body Package