如果我不知道列的名称,是否可以使用类似于索引或列位置来选择第二列的值?
Select col(2) FROM (
Select 'a', 'b',' c', 'd' from dual
)
这可行吗?当然可以。您可以编写一个PL / SQL块,使用 dbms_sql
打开一个游标,使用实际查询针对dual
,描述结果,将变量绑定到您发现的第二列,并从游标中提取并循环。这将是一个非常复杂且通常相当痛苦的过程,但它可以完成。
SQL语言没有定义一种在静态SQL语句中执行此操作的方法,Oracle也没有提供允许此操作的扩展。但是,如果您以某种方式知道想要第二个列,但不知道该列代表什么,那么我对您尝试解决的根本问题会感到相当担忧。这在关系数据库中并不合理。
SELECT ORDINAL_POSITION, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'dual'
不确定这是否是您需要的内容。
Select b FROM (
Select 'a', 'b' as b, 'c', 'd' from dual
)
如果您知道子查询中的列数,则可以实现:
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;
有一些限制:
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;
'b' as col2
等-这样您就有了一个已知的名称,而不是从值自动生成的名称。我假设您的实际用例更加复杂;尽管我无法想象为什么您希望或需要能够这样做。 - Alex Poole