说我有Table1
列:id1, name, column_name
还有Table2
个列:id2, id1 (fk), col1, col2, col3, ..., colN
这只是我正在寻找的一个简单的例子。实际上,这两个表之间有多个表。
Table1
下的column_name
中的值是字符串值"col1", "col2", "col3", ..., "colN"
。
基本上,我想要一个select语句,用"col1", "col2", ...
中的第1列,第2列,......的实际值替换字符串Table2
。
感谢。
答案 0 :(得分:1)
如果您知道架构并准备对所有可能的列名进行硬编码,那么您可以使用case
语句对其进行强制执行:
select case lower(t1.column_name)
when 'col1' then col1
when 'col2' then col2
when 'col3' then col3
...
when 'coln' then coln
end as result
from table1 t1
join table2 t2 on t2.id1 = t1.id1
where t1.id1 = 1;
如果您需要它更灵活,那么您需要使用动态SQL。你说你想要显示它,并且你已经用SQL Developer标记了这个问题,所以这可能意味着在SQL Worksheet脚本输出窗口中输出 - 你可以使用dbms_output
:
set serveroutput on
declare
l_id1 number := 1;
l_column_name table1.column_name%type;
l_cur_sql varchar2(80);
l_cur sys_refcursor;
l_result number;
begin
select column_name into l_column_name from table1 where id1 = l_id1;
l_cur_sql := 'select ' || l_column_name || ' from table2 '
|| 'where id1 = :id1';
open l_cur for l_cur_sql using l_id1;
loop
fetch l_cur into l_result;
exit when l_cur%notfound;
dbms_output.put_line(l_result);
end loop;
close l_cur;
end;
/
或者您可以使用SQL * Plus / SQL Developer绑定变量处理来简化游标处理而不依赖于dbms_output
:
var cur refcursor;
var id number;
exec :id := 1;
declare
l_column_name table1.column_name%type;
l_cur_sql varchar2(80);
begin
select column_name into l_column_name from table1 where id1 = :id;
l_cur_sql := 'select ' || l_column_name || ' from table2 '
|| 'where id1 = :id1';
open :cur for l_cur_sql using :id;
end;
/
print cur
他们真的都在做同样的事情。您将列名称从table1
获取到本地变量,并使用它创建动态SQL语句以从table2
中选择该列。您可以通过直接创建动态SQL语句table1
查询:
declare
l_cur_sql varchar2(80);
begin
select 'select ' || column_name || ' from table2 ' || 'where id1 = :id1'
into l_cur_sql
from table1
where id1 = :id;
open :cur for l_cur_sql using :id;
end;
/
但我认为它分两个阶段会更清晰。
答案 1 :(得分:0)
下面的选择将按表1上的主键和表2上的外键连接表。 select * from table1 inner join table2 on table1.id1 = table2.id1;
如果我明白了,下一步是用另一个表中的数据替换数据。
为此你可以制作剧本。
我整数;
开始
for i in(select * from table1 inner join table2 on table1.id1 = table2.id1)loop
update table1
set table1.col1 = i.col2
where id1 = i.id1;
结束循环;
端;
当然,您必须根据您的情况更改此声明。