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

如何在Oracle SQL(Oracle Forms 12c)中将多个列值组合为单个值,作为逗号分隔的字符串,sql,oracle,plsql,concatenation,oracleforms,Sql,Oracle,Plsql,Concatenation,Oracleforms,我有一个名为Data的表,如下所示 g_name g_id v_data ----- ---- ------ Test 123 ABC Test 123 DEG Test 123 None Test 123 Test 123 HIJ 我需要一个select查询,它返回如下值(在Oracle数据库中): listag()函数在Ora

我有一个名为Data的表,如下所示

g_name    g_id      v_data    
-----     ----      ------
Test      123        ABC
Test      123        DEG
Test      123        None
Test      123        
Test      123        HIJ
我需要一个select查询,它返回如下值(在Oracle数据库中):

  • listag()
    函数在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
子句将此结果传递到列。

如果您有在数据库中创建函数的选项,也许您可以将函数的结果检索为要执行的查询

让我给你举个例子:

1.我创建了一个包含6列的表

 create table test.mytest ( c1 number, c2 number , c3 number, c4 varchar2(10) , c5 number, c6 number );
2.我创建了一个函数来检索查询(或者您可以作为匿名plsql块调用)

4.使用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表单中检索结果。

首先,您需要表的主键列(调用
id
,我认为它是列列表中的第一列)

然后,您需要创建一个存储函数,其中包含
listag()
函数,该函数将用于组合从提供列名的其中一个字典视图派生的列名,例如
user\u tab\u columns
user\u tab\u cols
,或通过concatenetion仅使用
col
,动态查询返回每个
id
值的连接列

因此,通过在数据库中创建函数

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;
/
和作为常规查询语句从窗体调用:

SELECT id, get_value( id ) AS value
  FROM Data 

如果我只有3列,那么我可以在上面的查询中轻松地键入列名,但是如果我有50多列,那么这将是一项乏味的任务。你能告诉我一些动态的方法来连接所有的列吗(我不想输入所有的列名)?要动态地这样做,你需要一段以表名为参数的PL/SQL代码来获得作为输出的动态查询。在SQL中不能这样做。您想在答案中包含这一点吗?您好,Jim,Listag和其他一些函数(如组内函数)在Oracle Forms builder 12c中不起作用。Yes@Roberto,答案可以。Yes Listag将帮助您。
选择组内的Listag(列名称,,,)(按列名称排序)从cols那里,table_name='required_table';
但它必须在plsql中完成。你对此满意吗?嗨,戈登,如果我只有3列,这很好,那么我可以在上面的查询中轻松地键入列名,但是假设我有50多列,那么这将是一项繁琐的任务。你能告诉我一些动态的方法吗列(我不想键入所有列名)?Listag和其他一些函数在Oracle Forms builder 12c中不起作用。Listag和其他一些函数(如组内函数)在Oracle Forms builder 12c中不起作用。@AnujSingh…
Listag()
不适用于此问题,因为您要聚合的所有值都在同一行中。是否要保留将值串联在表单本身或数据库中的逻辑?
 SQL> select test.p_gen_query ( 'TEST' , 'MYTEST' , 'Y' ) from dual ;
 select C1 || ',' || C2 || ',' || C3 || ',' || C4 || ',' || C5 || ',' || C6 from TEST.MYTEST
 ;
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;
/
SELECT id, get_value( id ) AS value
  FROM Data