[英]How can combine the values of multiple columns to a single comma separated column in Oracle SQL?
[英]How to combine more than one column values into single value as a comma separated string in Oracle SQL (Oracle Forms 12c)
我有一个名为Data的表,如下所示
g_name g_id v_data
----- ---- ------
Test 123 ABC
Test 123 DEG
Test 123 None
Test 123
Test 123 HIJ
我想要一个 select 查询,它返回如下值(在 Oracle 数据库中):
Value
------------
Test,123,ABC
Test,123,DEG
...
...
...
LISTAGG()
function 在Oracle Forms Builder 12c
中不起作用。
可能有超过 3 列。 因此,我需要一种动态方式来将所有列组合在一起。
有人可以帮我吗?
您可以连接这些值:
select g_name || ',' || g_id || ',' || v_data
from t
请执行连接
select g_name||','||g_id||','||v_data from data;
您可以在 plsql 中编写动态查询并实现此目的。
select LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_name) as colum_name from cols where table_name = 'DATA';
使用into
子句将此结果传递给列。
如果您可以选择在数据库中创建 function,也许您可以检索 function 的结果作为您要执行的查询
让我给你看一个例子:
1.我创建了一个有 6 列的表。
create table test.mytest ( c1 number, c2 number , c3 number, c4 varchar2(10) , c5 number, c6 number );
2.我创建一个 function 来检索查询(或者您可以作为匿名 plsql 块调用)
create or replace function test.p_gen_query ( powner in varchar2 , ptable in varchar2, p_pretty in varchar2 default 'N' )
return clob
as
vowner varchar2(40) := upper(powner);
vtable varchar2(128) := upper(ptable);
vconta pls_integer;
vsql clob;
out_string varchar2(128);
cursor c_tab_columns
is
select column_name, count(*) over () tot_rows
from all_tab_columns where table_name = vtable and owner = vowner
order by column_id;
begin
vsql := ' select ' ;
for item in c_tab_columns
loop
out_string := item.COLUMN_NAME;
if c_tab_columns%rowcount = 1 then
dbms_lob.append(vsql,out_string||' || '','' || ');
elsif c_tab_columns%rowcount < item.tot_rows then
dbms_lob.append(vsql,out_string||' || '','' || ');
else
dbms_lob.append(vsql,out_string||' from '||vowner||'.'||vtable||' ');
end if;
end loop;
if p_pretty = 'Y'
then
dbms_lob.append(vsql,''||chr(10)||'');
dbms_lob.append(vsql,' ; ');
end if;
return vsql;
end;
/
3.调用function,p_pretty为'N'(检索没有sql终止符的查询)
SQL> set long 99999999 longchunksize 9999 lines 9999 pages 0
SQL> select test.p_gen_query ( 'TEST' , 'MYTEST' ) from dual ;
select C1 || ',' || C2 || ',' || C3 || ',' || C4 || ',' || C5 || ',' || C6 from TEST.MYTEST
4.调用 function 与 p_pretty 为 'Y' 与 sql 终止符
SQL> select test.p_gen_query ( 'TEST' , 'MYTEST' , 'Y' ) from dual ;
select C1 || ',' || C2 || ',' || C3 || ',' || C4 || ',' || C5 || ',' || C6 from TEST.MYTEST
;
通过这种方式,您可以将它用于您想要以这种方式构建的任何查询。 我想你可以从 Oracle Forms 中检索结果。
首先,您需要一个表的主键列(调用id
,我假设它是列列表中的第一列)。
然后,您需要创建一个存储的 function,其中包含LISTAGG()
function,它将用于组合从字典视图之一派生的列名称,给出col
名称,例如user_tab_columns
, user_tab_cols
或只是通过连接查询返回的动态,每个id
值的连接列。
因此,通过以下方式在数据库中创建 function;
CREATE OR REPLACE FUNCTION get_value( i_id Data.id%type ) RETURN VARCHAR2 IS
v_out VARCHAR2(32767);
BEGIN
SELECT LISTAGG(column_name, '|| '','' ||') WITHIN GROUP (ORDER BY column_id)
INTO v_out
FROM cols
WHERE table_name = 'DATA'
AND column_id > 1;
EXECUTE IMMEDIATE 'SELECT '||v_out||' FROM Data WHERE id = :v_id' INTO v_out USING i_id;
RETURN v_out;
END;
/
并从 Forms 作为常规查询语句调用:
SELECT id, get_value( id ) AS value
FROM Data
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.