根据另一个表中的CSV选择列

时间:2013-05-24 11:44:44

标签: sql oracle plsql oracle10g

我有一张包含以下内容的表格:

表1

ID Range        Rate
1  A,B,C,D,E,F   1.2
2  A,B,C         3.1 

和另一张表:

表2

ID A B C D E F G H J K
1  1 2 1 3 4 2 4 5 8 1     
2  1 2 1 3 4 2 4 5 8 1     

基本上这告诉我们哪些列可以应用速率,例如我们可以将速率1.2应用于存储在表2的列A,B,C,D,E,F中的值,并且应该应用3.2的速率仅限于A,B和C列。

我正在加入ID列上的两个表

Select * From Table1 
Inner Join Table2 ON Table1.ID = Table2.ID

但是我想要实现的是在连接2个表之后根据Table1的Range列的内容选择Table2中的列。

基于上面的例子,从Table1开始,第一列的范围字段有:A,B,C,D,E,F所以从Table2开始,我试图只选择A,B,C,D,E列,F并将速率(1.2)应用于所有这些并保持其余列不受影响,因此解决方案将如下所示:

ID A       B     C      D      E      F      G  H   J  K
1  1*1.2  2*1.2  1*1.2  3*1.2  4*1.2  2*1.2  4  5   8  1
2  1*3.1  2*3.1  1*3.1  3      4      2      4  5   8  1 

希望这是有道理的。

由于

2 个答案:

答案 0 :(得分:2)

不太好(非常脆弱),但是:

select  case when 'A' in t1.Range then t2.a * t1.rate else t2.a else end a,
        case when 'B' in t1.Range then t2.b * t1.rate else t2.b else end b,
        case when 'C' in t1.Range then t2.c * t1.rate else t2.c else end c,
        case when 'D' in t1.Range then t2.d * t1.rate else t2.d else end d,
        ...
from    Table1 t1 left join Table2 t2 on t1.id = t2.id

答案 1 :(得分:2)

您正在寻找逗号分隔列表中的子字符串。 SQL标准的方法是使用like

select t2.id,
       t2.a * (case when ','||Range||',' like '%,A,%' then t1.rate else 1 else end) as a,
       t2.b * (case when ','||Range||',' like '%,B,%' then t1.rate else 1 else end) as b,
       t2.c * (case when ','||Range||',' like '%,C,%' then t1.rate else 1 else end) as c,
       t2.d * (case when ','||Range||',' like '%,D,%' then t1.rate else 1 else end) as d,
       t2.e * (case when ','||Range||',' like '%,E,%' then t1.rate else 1 else end) as e,
       t2.f * (case when ','||Range||',' like '%,F,%' then t1.rate else 1 else end) as f,
       t2.g * (case when ','||Range||',' like '%,G,%' then t1.rate else 1 else end) as g,
       t2.h * (case when ','||Range||',' like '%,H,%' then t1.rate else 1 else end) as h,
       t2.j * (case when ','||Range||',' like '%,J,%' then t1.rate else 1 else end) as j,
       t2.k * (case when ','||Range||',' like '%,K,%' then t1.rate else 1 else end) as k
from Table1 t1 left join
     Table2 t2
     on t1.id = t2.id;

具体来说,这是分隔范围,因此每个值都有一个逗号前后(包括第一个和最后一个)。然后它会为每个值寻找模式。

我应该提到这种类型的查询表明数据结构不佳。对于每个值,Table1应该有单独的行。

相关问题