根据另一个表填充行,但检查列是否存在?

时间:2017-05-29 16:06:24

标签: sql oracle oracle11g

嗨大家我是新来的,可以帮助您编写SQL脚本/函数以解决以下问题。

我有一个source表,其中包含三列NameValuemiNum。此表中的数据示例如下:

Name      Value      miNum
A+B+C     1+2+3       a1
C+D+E     3+4+5       a3
E+F       5+2         a7

现在,我创建了一个final_table,该表的列与source表相同,但附加的列标记为a-z(总共29列)。 我希望脚本/函数做的是从source表读取每一行并填充final_table中的相应列。

final_table

的输出示例
Name    Value   miNum    A   B  C  D  E  F
A+B+C   1+2+3    a1      1   2  3  
C+D+E   3+4+5    a3             3  4  5
E+F     5+2      a7                   5  2

新的列将定期添加到final_table中,因此将列硬编码到SQL代码中是没有意义的。是否可以在不对列名进行硬编码的情况下完成所有这些操作?

请有人可以告诉我如何实现这一切。

由于

1 个答案:

答案 0 :(得分:0)

请根据此架构添加其余列:

select tst.*, 
case when instr(name,'A') > 0 then substr(Value,instr(name,'A'),1) end A,
case when instr(name,'B') > 0 then substr(Value,instr(name,'B'),1)  end B,
case when instr(name,'C') > 0 then substr(Value,instr(name,'C'),1)  end C,
case when instr(name,'D') > 0 then substr(Value,instr(name,'D'),1)  end D,
case when instr(name,'E') > 0 then substr(Value,instr(name,'E'),1)  end E,
case when instr(name,'F') > 0 then substr(Value,instr(name,'F'),1)  end F
from tst;

给出结果

NAME   VALUE  MINUM  A B C D E F
------ ------ ------ - - - - - -
A+B+C  1+2+3  a1     1 2 3       
C+D+E  3+4+5  a3         3 4 5   
E+F    5+2    a7             5 2 

请注意,此方法仅适用于唯一名称,即对于重复名称,仅显示第一个值,例如

NAME   VALUE  MINUM  A B C D E F
------ ------ ------ - - - - - -
A+A+A  5+2+1  a11    5 

另一个限制是密钥只有A-Z且值是单个字符,如果这样,您可以使用此insert填充目标表:< / p>

Insert into TARGET 
(name, value, miNum,A,B,C,D,E,F)
select name, value, miNum, 
case when instr(name,'A') > 0 then substr(Value,instr(name,'A'),1) end A,
case when instr(name,'B') > 0 then substr(Value,instr(name,'B'),1)  end B,
case when instr(name,'C') > 0 then substr(Value,instr(name,'C'),1)  end C,
case when instr(name,'D') > 0 then substr(Value,instr(name,'D'),1)  end D,
case when instr(name,'E') > 0 then substr(Value,instr(name,'E'),1)  end E,
case when instr(name,'F') > 0 then substr(Value,instr(name,'F'),1)  end F
from source; 

您必须将插入列列表和查询扩展到列Z