Oracle SQL查询,根据其他表中的条件更改列标题
编辑:这篇文章与Oracle有关,要求sql表达式满足以下要求。 我有一个要求,即有一个名为data with columns的表: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 :>
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我希望您能够登录