有条件地将选择查询中的值替换为1,如果另一个表中的值为0,则将其替换为0

时间:2019-07-26 11:04:29

标签: sql replace sql-server-2014

我有2张桌子:

OriginTable

ID | Monday | Tuesday | Wednesday
1  | 1      | 1       | 2

#ContrastTable

ID | MoTotal | TuTotal | WeTotal
1  | 6       | 0       | 32

我想这样做:

Select ot.Monday, ot.Tuesday, ot.Wednesday From OriginTable ot

| 1      | 1       | 2

但是我想编辑结果集,使得如果ContrastTable中的 Total 为0,它将用OriginTable select中的那天替换为0

一些Crappy-SQL™看起来像这样(这只是为了展示我的意图,我知道这是行不通的):

Select ot.Monday, Replace(ot.Tuesday, ot.Tuesday, (ct.TuTotal) `[if ct.TuTotal is 0]`), ot.Wednesday From OriginTable ot
Inner Join #ContrastTable ct on ot.ID = ct.ID

3 个答案:

答案 0 :(得分:1)

使用IIF()可以获得预期的结果:

Select ot.Monday, 
       --Replace(ot.Tuesday, ot.Tuesday, (ct.TuTotal) `[if ct.TuTotal is 0]`),
       IIF(ct.TuTotal = 0, ct.TuTotal, ot.Tuesday) AS Tuesday
       ot.Wednesday 
From OriginTable ot
Inner Join #ContrastTable ct on ot.ID = ct.ID

答案 1 :(得分:1)

尝试一下:

 select ot.id
 , case when c.MoTotal = 0 then 0 else ot.Monday end as Monday 
 , case when c.TuTotal = 0 then 0 else ot.Tuesday end as Tuesday
 , case when c.WeTotal= 0 then 0 else ot.Wednesday end as Wednesday 
  From OriginTable ot 
 inner join #ContrastTable as c on ot.id=c.id

答案 2 :(得分:1)

使用case表达式:

select (case when ct.MoTotal = 0 then 0 else ot.Monday end) as Monday,
       (case when ct.TuTotal = 0 then 0 else ot.Tuesday end) as Tuesday,
       (case when ct.WeTotal = 0 then 0 else ot.Wednesday end) as Wednesday
from OriginTable ot left join
     #ContractTable ct
     on ct.id = ot.id;