首页 > 解决方案 > 获取查询结果的列名 Oracle SQL

问题描述

我需要一个查询来获取另一个查询结果的列名。另一个查询可以是任何东西——我不能对它做出任何假设,但它通常是一些SELECT陈述。

例如,如果我有这张桌子Members

Id | Name | Age
---|------|----
1  | John | 25
2  | Amir | 13

而这个SELECT说法 SELECT Name, Age FROM Members

那么我试图写的查询的结果将是

Name
Age

在 SQL Server 中,有一个函数 - sys.dm_exec_describe_first_result_set- 可以执行此操作,但我在 Oracle 中找不到等效函数。

我尝试使用这个答案,但由于权限问题我不能使用语句,并且出于同样的原因CREATE TYPE我可能不能使用语句。CREATE FUNCTION

标签: sqloracleplsql

解决方案


假设您有这样的查询:

select *
from   (select deptno, job, sal from scott.emp)
pivot  (avg(sal) as avg_sal for job in 
           ('ANALYST' as analyst, 'CLERK' as clerk, 'SALESMAN' as salesman)
       )
order by deptno
;

这会产生结果:

    DEPTNO ANALYST_AVG_SAL CLERK_AVG_SAL SALESMAN_AVG_SAL
---------- --------------- ------------- ----------------
        10                          1300                 
        20            3000           950                 
        30                           950             1400

注意列名(如)——它们在查询中的任何地方ANALYST_AVG_SAL都没有完全以这种形式出现!它们由两个独立的部分组成,并用下划线放在一起。

现在,如果您被允许创建视图(请注意,这不会在您的数据库中创建任何数据 - 它只是保存查询的文本),您可以这样做:

创建视图(只需将第一行代码添加到我们已有的内容中):

create view q201028_vw as
select *
from   (select deptno, job, sal from scott.emp)
pivot  (avg(sal) as avg_sal for job in 
            ('ANALYST' as analyst, 'CLERK' as clerk, 'SALESMAN' as salesman)
       )
order by deptno
;

(这里我假设你有一些方法来识别查询,一个 id like Q201028,并在视图名称中使用它。这并不重要,除非你需要经常这样做并且同时处理大量查询。)

然后,您可以通过查询*_TAB_COLUMNS. 例如:

select column_id, column_name
from   user_tab_columns
where  table_name = 'Q201028_VW'
order  by column_id
;

 COLUMN_ID COLUMN_NAME         
---------- --------------------
         1 DEPTNO              
         2 ANALYST_AVG_SAL     
         3 CLERK_AVG_SAL       
         4 SALESMAN_AVG_SAL 

现在,如果您不需要它用于其他任何事情,您可以删除该视图。

顺便说一句:在 Oracle 中,在数据库中“保存”查询的“通常”方式是创建视图。如果它们已经存在于您的数据库中,那么您所需要的就是我向您展示的最后一步。否则,“其他查询”(您需要为其查找列)是否首先来自?


推荐阅读