Oracle SQL -在不知道列名的情况下选择列

3b6akqbq  于 2023-03-07  发布在  Oracle
关注(0)|答案(5)|浏览(158)

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

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

dluptydi1#

可以吗?当然可以。您可以编写一个PL/SQL块,使用dbms_sql打开一个游标,使用针对dual的实际查询,描述结果,将一个变量绑定到您发现的第二列是什么,从游标中提取,然后循环。这将是一个非常复杂的过程,通常相当痛苦,但它可以做到。
SQL语言没有定义在静态SQL语句中执行此操作的方法,Oracle也没有提供允许此操作的扩展。不过,如果您知道自己想要第二列,但不知道该列表示什么,我更担心您试图解决的潜在问题。这在关系数据库中没有多大意义。

xeufq47z

xeufq47z2#

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

不确定这是不是你需要的。

dbf7pr2w

dbf7pr2w3#

如果你不知道名字,就给它起个好听的名字;).

Select b FROM (
    Select 'a', 'b' as b, 'c', 'd' from dual
)
7d7tgy0s

7d7tgy0s4#

如果您知道子查询中的列数,则可以执行以下操作:

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
  • 不建议用于生产
db2dz4w8

db2dz4w85#

正如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 Docu。

相关问题