【发布时间】:2021-12-26 21:52:54
【问题描述】:
我需要一个查询来获取另一个查询结果的列名。另一个查询可以是任何东西——我不能对它做出任何假设,但它通常是一些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 中找不到等效函数。
我尝试使用this answer,但由于权限问题我无法使用CREATE TYPE 语句,并且出于同样的原因我可能无法使用CREATE FUNCTION 语句。
【问题讨论】:
-
如果您无权执行某些操作,这将很难。您可能会告诉您的老板,如果没有这些权限,您将无法解决问题 - 他们要么授予您(即使是临时的),要么将任务分配给拥有权限的其他人。例如:列(和列名)可以在 PIVOT 子句或 MATCH_RECOGNIZE 子句中创建,等等。查询可能是 SELECT * FROM ... 并且列名来自 PIVOT 或 MATCH_RECOGNIZE 或其他的整个世界东西。
-
我知道的唯一方法是将动态 sql 与 DBMS_SQL 一起使用,这是一种皇家痛苦
-
一般的解决方案是从您的 select 语句中创建一个视图 - 然后您可以轻松地检查该视图(特别是查看它具有哪些列名);但要做到这一点,您需要能够创建视图。如果你不能创建视图,那么你就不能使用这种方法,即使它可能是最简单的。
-
从 12c 开始,您可以使用
with function将列列表构建为带有链接答案中的代码的单个varchar2/clob,然后使用例如xmltable将其转换为行集。这不需要create权限 -
这不是 SQL(查询语言)的用途。好吧,astenix 仍然提到了一种从查询中获取列名的方法。然而,通常这不是 SQL 的任务。但是 DBMS 在与您的应用程序的对话中执行此操作。当您的应用向 DBMS 发送类似
SELECT Name, Age FROM Members或SELECT * FROM Members的查询字符串时,DBMS 不仅会返回一个匿名结果表,还会包含列名。