OR语句后面的AND语句与
类似的逻辑是否相同where d.res_id = 125 and t.task_type in( 'PPB', 'PPO')
and
d.status = ('C')
OR
d.status IN ('R' ,'D')
AND
t.done_dt = DATEADD(month, -1, GETDATE())
where d.res_id = 125 and t.task_type in( 'PPB', 'PPO')
IF d.status IN ('R','D')
t.done_dt = DATEADD(month, -1, GETDATE())
ELSE
d.status = 'C'
哪一种格式化的正确方法?
我正在尝试以“C”状态显示所有d.status。但是,只有t.done_dt是上个月,我才能显示d.status IN('R','D')
答案 0 :(得分:2)
由于Operator Precedence,and
在or
之前评估。所以,你得到这样的东西:
where d.res_id = 125 and t.task_type in( 'PPB', 'PPO')
and
d.status = ('C')
OR
(
d.status IN ('R' ,'D')
AND
t.done_dt = DATEADD(month, -1, GETDATE())
)
那就是说,我喜欢明确地使用括号,所以我不必如此努力地思考它。
答案 1 :(得分:1)
我想你想把这个伪代码翻译成SQL?
where d.res_id = 125 and t.task_type in( 'PPB', 'PPO')
AND
IF d.status IN ('R','D')
t.done_dt = DATEADD(month, -1, GETDATE())
ELSE
d.status = 'C'
那将是:
where d.res_id = 125 and t.task_type in( 'PPB', 'PPO')
AND ( ( d.status = 'C' ) -- SHOW ALL 'C'
OR ( d.status IN ('R','D') and t.done_dt = DATEADD(month, -1, GETDATE()) )
-- SHOW ALL R,D on that date
)
答案 2 :(得分:0)
首先,不要打扰运算符优先级并使用explicit()。它会增加你的可读性。
如果您想查看所有状态' R',' D'您上个月需要更改一下您的查询:
where d.res_id = 125 and t.task_type in ('PPB', 'PPO') AND
( d.status = 'C'
OR ( d.status IN ('R', 'D') and
-- Compare the first day of the month of your date and first day of the current month
CONVERT(DATE,dateadd(dd,-(day(t.done_dt)-1),t.done_dt)) = DATEADD(MONTH, -1, CONVERT(DATE,dateadd(dd,-(day(getdate())-1),getdate()))
)
)