SQL,OR和STATEMENT

时间:2017-03-31 15:08:43

标签: sql sql-server-2008 tsql sql-server-2012

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

3 个答案:

答案 0 :(得分:2)

由于Operator Precedenceandor之前评估。所以,你得到这样的东西:

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