我有一张包含以下内容的表格:
表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
希望这是有道理的。
由于
答案 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应该有单独的行。