繁体   English   中英

如何在 Oracle SQL 中将多个列值组合成单个值作为逗号分隔的字符串(Oracle Forms 12c)

[英]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_columnsuser_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM