Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL查询,根据其他表中的条件更改列标题_Sql_Oracle - Fatal编程技术网

Oracle SQL查询,根据其他表中的条件更改列标题

Oracle SQL查询,根据其他表中的条件更改列标题,sql,oracle,Sql,Oracle,编辑:这篇文章与Oracle有关,要求sql表达式满足以下要求。 我有一个要求,即有一个名为data with columns的表: DATA_ID APP_ID COLUMN_1 COLUMN_2 COLUMN_3 我必须编写一个查询,根据app_id将列标题名称替换为表DATA_标题中的名称 因此,如果app_id=1,则列将为: COLUMN_1 :> Name COLUMN_2 :> Status COLUMN_3 :> Assigned COLUMN_1 :>

编辑:这篇文章与Oracle有关,要求sql表达式满足以下要求。

我有一个要求,即有一个名为data with columns的表:

DATA_ID
APP_ID
COLUMN_1
COLUMN_2
COLUMN_3
我必须编写一个查询,根据app_id将列标题名称替换为表DATA_标题中的名称

因此,如果app_id=1,则列将为:

COLUMN_1 :> Name
COLUMN_2 :> Status
COLUMN_3 :> Assigned
COLUMN_1 :> Title 
COLUMN_2 :> Status
COLUMN_3 :> Title_New
如果app_id=2,则列为:

COLUMN_1 :> Name
COLUMN_2 :> Status
COLUMN_3 :> Assigned
COLUMN_1 :> Title 
COLUMN_2 :> Status
COLUMN_3 :> Title_New
应该有附加条件,如果数据_标题中没有名称,它将与原始列名保持一致,即列_1、列_2、列_3,因为根据应用_id,将来会有更多/更少的列标题可用。因此,如果列标题存在,它应该替换,否则保持原始


这两个表将基于APP_ID进行连接。

我在您的工作区中创建了一个基于样本数据emp/dept的样本应用程序(可以通过sql workshop>实用程序>样本数据集加载)。我添加了一个带有一些数据的表emp_头。其思想是为每个不同的应用程序的数据库列定义不同的列标题

create table emp_header (
    id                             number generated by default on null as identity  
                                   constraint emp_header_id_pk primary key,
    app_id                         number,
    db_column_name                 varchar2(100) not null,
    report_header                  varchar2(100) not null
)
;

insert into emp_header (app_id, db_column_name, report_header ) values (1, 'ENAME', 'Employee Name');
insert into emp_header (app_id, db_column_name, report_header ) values (2, 'ENAME', 'Ename');
insert into emp_header (app_id, db_column_name, report_header ) values (1, 'JOB', 'Employee Job');
insert into emp_header (app_id, db_column_name, report_header ) values (2, 'JOB', 'Job');
在主页上,我创建了一个选择列表,用户可以在其中选择应用程序。选择该值后,页面将被提交并重定向到第2页。 在第2页中,有两个页面项:P2_列_1和P2_列_2,在页眉之前有一个计算,用于设置加载页面时的值。 计算示例:

DECLARE
  l_returnvalue emp_header.report_header%TYPE;
BEGIN
  SELECT report_header 
    INTO l_returnvalue
    FROM emp_header WHERE db_column_name = 'ENAME' AND app_id = :P2_APP_ID;
  RETURN l_returnvalue;
EXCEPTION WHEN NO_DATA_FOUND THEN
  RETURN 'ENAME Original Value';
END;
  
正如您在计算代码中所看到的,如果在emp_头表中找不到值,则会有一个回退值。在本例中,它是“ENAME Original Value”,但您可以随意创建它

在报告属性列属性中,列ENAME的标题设置为&P2\u column\u 1。以及将列作业发送到&P2\u column\u 2。
运行第1页并为app id选择一个值。根据您的选择查看不同的列标题。

返回变量结果集的SQL语句需要Oracle Data Cartridge、ANYDATASET和其他技巧。您可以使用我的开源程序,而不是自己编写代码。安装后,必须编写生成查询的查询,如下所示:

select * from table(method4.dynamic_query(
    q'[
        select
            'select data_id, app_id, ' ||
            'COLUMN_1 ' || max(case when id = 1 then '"'|| header_name || '"' else null end) || ', ' ||
            'COLUMN_2 ' || max(case when id = 2 then '"'|| header_name || '"' else null end) || ', ' ||
            'COLUMN_3 ' || max(case when id = 3 then '"'|| header_name || '"' else null end) ||
            ' from data where app_id = 2' sql_statement
        from data_header
        where app_id = 2
    ]'
));

DATA_ID   APP_ID   Title   Status     Title New
-------   ------   -----   --------   ---------
    100        2   Anna    Inactive   BA
    100        2   Ronnie  Active     MI and AI

或者,如果您使用18c,您可以创建一个多态表函数。但正如其他人所指出的,这个问题通常最好在像Apex这样的应用程序中解决。

您更改了问题标签(删除了Oracle 12c并添加了Oracle Apex);你怎么知道是关于Apex的?我的意思是,
app\u id
可以是任何东西,与Apex无关…@Littlefoot我对Apex也有类似的查询,但在不同的线程中。这个问题在db级别。然而,类似的要求是为顶点太,我需要帮助,在这也包括你可以看看@Littlefoot很好,这个用户在过去几天里一直在发布apex问题,所以我认为这也是apex的问题。将删除标记并将my answerSELECT column_1、column_2更新为:P1_column_1_标头,:P1_column_2_标头,其中app_id=:app_id;此查询将不起作用,因为数据\u标头没有列\u 1…列,因此它将抛出错误。您的意思是:从数据中选择列_1、列_2进入:P1_列_1_标题,:P1_列_2_标题--此表中app_id=:app_id;正如有人在另一个问题中建议的那样,如果您在apex.oracle.com上的测试工作区中创建了一个示例应用程序,那么我们就可以查看它。解决方案取决于您希望在何处运行此查询。在apex中,报告的标题是区域属性。我不知道如何在sqlplus中动态获取列标题。如果您能解释业务需求,这会有所帮助……在apex中,我如何将这些添加到列标题中?在apex中,我从数据中创建一个IG select col01…col03;然后,对于col01,创建页面项P1\u COL1,对于项write查询,如。从id=1和app\u id=:app\u id的data\u header中选择header\u name。现在,我将如何将此页面项分配给交互式网格中的列?(apex要求需要在IG上完成)我在下面的回答中描述了它?正如有人在另一个问题中建议的那样,如果您在apex.oracle.com上的测试工作区中创建了一个示例应用程序,那么我们就可以查看它了。尽管对于P4_app_ID,在原始应用程序中有太多javascript条件,我无法复制。如果我们能解决这个问题great@KoenLostrie我希望您能够登录