是否可以将此语句作为列而不是行返回?可能使用数据透视查询?
select * from MYTABLE Where SOMECOLUMN = RESULT THAT RETURNS ONE RECORD
答案 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