【问题标题】:Oracle SQL Query to change column headers on basis of conditions from another tableOracle SQL Query 根据另一个表的条件更改列标题
【发布时间】:2020-09-01 02:28:30
【问题描述】:

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

我有一个要求,其中有一个名为 data 的表:

DATA_ID
APP_ID
COLUMN_1
COLUMN_2
COLUMN_3

我必须编写一个查询,根据 app_id 将列标题名称替换为 DATA_HEADER 表中的名称。

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

COLUMN_1 :> Name
COLUMN_2 :> Status
COLUMN_3 :> Assigned

如果 app_id=2,列将是:

COLUMN_1 :> Title 
COLUMN_2 :> Status
COLUMN_3 :> Title_New

应该有额外的条件,如果 data_header 中没有名称,它将坚持使用原始列名,即 COLUMN_1,COLUMN_2,COLUMN_3,因为根据 app_ids,将来根据 app_id 将有更多/更少的列标题可用。所以如果列标题存在,它应该替换,否则保持原始。

这 2 个表将根据 APP_ID 进行连接。

【问题讨论】:

  • 解决方案取决于您要在哪里运行此查询。在 apex 中,报告的标题是区域属性。我不知道如何动态获取 sqlplus 中的列标题。如果您解释业务需求会有所帮助...
  • 在 apex 中,我如何将这些添加到列标题?在顶点中,我从数据中创建了一个 IG 选择 col01...col03;然后说 col01,创建页面项目 P1_COL1 并为项目写查询。从 id=1 和 app_id=:app_id 的 data_header 中选择 header_name。现在我将如何将此页面项目分配给交互式网格中的列? (顶点要求需要在IG上完成)
  • 我在下面的答案中描述了它?正如有人在另一个问题中建议的那样,如果您在 apex.oracle.com 上的测试工作区中创建了一个示例应用程序,这将非常有帮助,以便我们查看它。
  • 虽然对于 P4_APP_ID,在原始应用程序中有太多我无法复制的 javascript 条件。如果我们能解决它会很棒
  • @KoenLostrie 希望你能登录

标签: sql oracle


【解决方案1】:

我根据示例数据 emp/dept 在您的工作区创建了一个示例应用程序(可以通过 sql Workshop > Utility > 示例数据集加载)。我添加了一个包含一些数据的表 emp_header。这个想法是您为每个不同的应用程序的数据库列定义不同的列标题

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 页中有 2 个页面项:P2_COLUMN_1 和 P2_COLUMN_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_header 表中找不到值,则会有一个备用值。在这种情况下,它是“ENAME 原始值”,但您可以随意设置。

在报告属性列属性中,列 ENAME 的标题设置为 &P2_COLUMN_1。并且对于 &P2_COLUMN_2 的列 JOB。 运行第 1 页并为应用程序 ID 选择一个值。根据您的选择查看不同的列标题。

【讨论】:

  • 您更改了问题标签(删除了 Oracle 12c 并添加了 Oracle Apex);你怎么知道它是关于 Apex 的?我的意思是,app_id 可能是任何东西,与 Apex 无关...
  • @Littlefoot 我对顶点也有类似的查询,但在不同的线程中。这个问题是在数据库级别。然而,顶点也有类似的要求,我也需要帮助,否则你可以看看。 stackoverflow.com/questions/63609252/…
  • @Littlefoot 好点,这个用户在过去几天一直在发布顶点问题,所以我认为这也是针对顶点的。将删除标签并更新我的答案
  • SELECT column_1, column_2 INTO :P1_COLUMN_1_HEADER, :P1_COLUMN_2_HEADER FROM data_header WHERE app_id = :APP_ID;此查询将不起作用,因为 data_header 没有 column_1 ....列,因此它会引发错误。您的意思是:SELECT column_1, column_2 INTO :P1_COLUMN_1_HEADER, :P1_COLUMN_2_HEADER FROM data --this table WHERE app_id = :APP_ID;
  • 正如有人在其他问题中所建议的那样,如果您在 apex.oracle.com 上的测试工作区中创建了一个示例应用程序,这将非常有帮助,以便我们查看它。
【解决方案2】:

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

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 这样的应用程序中解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多