Oracle SQL - 不知道列名如何选择列

3

如果我不知道列的名称,是否可以使用类似于索引或列位置来选择第二列的值?

Select col(2) FROM (
    Select 'a', 'b',' c', 'd' from dual
)

不可以,虽然你可以在“order by”语句中使用该语法。 - Gordon Linoff
对于您的示例,您可以在子查询中为列设置别名; 'b' as col2等-这样您就有了一个已知的名称,而不是从值自动生成的名称。我假设您的实际用例更加复杂;尽管我无法想象为什么您希望或需要能够这样做。 - Alex Poole
5个回答

6

这可行吗?当然可以。您可以编写一个PL / SQL块,使用 dbms_sql 打开一个游标,使用实际查询针对dual ,描述结果,将变量绑定到您发现的第二列,并从游标中提取并循环。这将是一个非常复杂且通常相当痛苦的过程,但它可以完成。

SQL语言没有定义一种在静态SQL语句中执行此操作的方法,Oracle也没有提供允许此操作的扩展。但是,如果您以某种方式知道想要第二个列,但不知道该列代表什么,那么我对您尝试解决的根本问题会感到相当担忧。这在关系数据库中并不合理。


3
SELECT ORDINAL_POSITION, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'dual'

不确定这是否是您需要的内容。


2
如果您不知道名称,只需给它一个好听的名字即可。;)
Select b FROM (
    Select 'a', 'b' as b, 'c', 'd' from dual
)

0

如果您知道子查询中的列数,则可以实现:

SELECT COL2 FROM (
  SELECT NULL COL1, NULL COL2, NULL COL3, NULL COL4 
  UNION ALL 
  select 'a', 'b', 'c', 'd' from dual
) 
WHERE COL2 IS NOT NULL;

有一些限制:

  • 查询语句难以阅读和理解
  • 你需要知道列的数量
  • 值不能为NULL
  • 不建议在生产环境中使用

0
正如Justin Cave所说,没有内置的SQL方法可以获取未知列名,但可以通过PL/SQL完成。以下是一个示例,演示了Justin所说的方法。
declare
  cur             INTEGER;
  tab_description DBMS_SQL.DESC_TAB;
  col_num         NUMBER;
begin
  --open a cursor
  cur := dbms_sql.OPEN_CURSOR;
  --parse your query
  dbms_sql.PARSE(cur, 'select 1 a, 2 b, 3 c from dual', DBMS_SQL.NATIVE);
  --now let dbms_sql describe your columns (col_num and tab_description are OUT Parameter)
  dbms_sql.DESCRIBE_COLUMNS(cur, col_num, tab_description);
  --close the cursor
  dbms_sql.CLOSE_CURSOR(cur);
  
  --number of columns in your Query
  dbms_output.put_line(col_num);
  
  --loop and print the column names
  for i in 1..col_num loop
    dbms_output.put_line(tab_description(i).col_name);
  end loop;
end;

您可以创建自己的 PL/SQL 函数以获取查询所需的信息。如需更多信息,建议查看 Oracle 文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接