我有成千上万个表,每个表都有自己的唯一键列。我想在单个查询中基于表名称选择键。如果有帮助,它总是表中的第二列。
我想要类似的东西
select c_name from t_name
where c_name (is)
(
select column_name as c_name
from Dba_tab_Columns
where table_name = t_name
and column_name like '%name' --->>>(((or column_id =2)))
)
我知道t_name,但是我需要一个查询才能根据table_name选择列名。
因此,如果我说select c_name from Animals
,它应该给我所有动物的清单,如果我说select c_name from Cars
,它应该给我一个小汽车清单。
答案 0 :(得分:0)
您不能在纯SQL中执行此操作,您将需要一个表函数。这是一种方法:
create or replace type tvc as table of varchar2(128);
/
create or replace function return_col (tname user_tables.table_name%type) return tvc pipelined
as
c_statement varchar2(400);
get_data sys_refcursor;
out_d varchar2(128);
begin
for gettnames_and_cols in (select c.column_name
from user_cons_columns c, user_constraints uc
where constraint_type in ('P','U') and uc.table_name=c.table_name and c.table_name=upper(tname)) loop
c_statement:='select '||gettnames_and_cols.column_name||' as output_col from '||tname;
open get_data for c_statement;
while true loop
fetch get_data into out_d;
exit when get_data%notfound;
pipe row(out_d);
end loop;
close get_data;
end loop;
return;
end;
/
事情是,这仅给出了数据,而不知道列名是什么或数据来自哪个表。您可以修改PL / SQL代码以添加此信息。此外,这还假定数据将以VARCHAR2(128)的形式返回,您可能需要根据需要对其进行调整。您可以按以下方式使用此表函数:
select *
from table (return_col('your_table_name'));