2017-03-31 71 views
0

是否和声明后OR语句具有相同的逻辑类似于SQL,OR和Statement

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

以及第二个犯规有权sintaxis。你想做什么?。你可能会问错了问题[**什么是XY问题?**](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+0

可能的[SQL的重复逻辑运算符优先级:和和或](http://stackoverflow.com/questions/1241142/sql-logic-operator-precedence-and-and-or) – JimmyB

+0

你应该总是用括号括住'OR'条件。 – Stephen

回答

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

因为Operator Precedence的,andor前评估。所以,你得到的东西是这样的:

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()) 
) 

这么说,我喜欢用括号明确,所以我没有去想它这么难。

0

首先与运营商的优先级)也懒得和使用显式(。这将添加到您的可读性。

如果你想看到所有的状态“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())) 
    ) 
    )