sql:如何正确地用这么多AND构成where子句

sql:如何正确地用这么多AND构成where子句,sql,Sql,以下内容将忽略日期范围。有人能解释一下这里出了什么问题吗?不确定某些语句是否需要在其周围加括号,但无论如何也不明白为什么 WHERE booking_date BETWEEN '2011-11-01' AND '2011-12-21' AND booking_status = 'Confirmed' OR booking_status = 'Cancelled' OR booking_status = 'Rearranged' AND invoice_number='' O

以下内容将忽略日期范围。有人能解释一下这里出了什么问题吗?不确定某些语句是否需要在其周围加括号,但无论如何也不明白为什么

WHERE
     booking_date BETWEEN '2011-11-01' AND '2011-12-21'
 AND booking_status = 'Confirmed'
  OR booking_status = 'Cancelled'
  OR booking_status = 'Rearranged'
 AND invoice_number=''
ORDER BY booking_date ASC

这可能是您想要的:

WHERE booking_date BETWEEN '2011-11-01' AND '2011-12-21'
AND (booking_status = 'Confirmed' OR booking_status = 'Cancelled' OR booking_status = 'Rearranged')
AND invoice_number=''
ORDER BY booking_date ASC"
添加的换行符只是为了便于阅读。重要的部分是括号


查看本页以了解运算符优先级的解释:

条件周围加括号:

WHERE
     booking_date BETWEEN '2011-11-01' AND '2011-12-21'
 AND (booking_status = 'Confirmed'
      OR booking_status = 'Cancelled'
      OR booking_status = 'Rearranged')
 AND invoice_number=''
ORDER BY booking_date ASC
您也可以在中使用
,这可能更容易阅读和理解:

WHERE
     booking_date BETWEEN '2011-11-01' AND '2011-12-21'
 AND booking_status IN ('Confirmed', 'Cancelled', 'Rearranged')
 AND invoice_number=''
ORDER BY booking_date ASC
并且具有高于或。您的代码被解释为:

WHERE (booking_date BETWEEN '2011-11-01' AND '2011-12-21'
       AND booking_status = 'Confirmed')
OR (booking_status = 'Cancelled')
OR (booking_status = 'Rearranged' AND invoice_number='')
我建议不要使用OR,而是在中使用:

WHERE booking_date BETWEEN '2011-11-01' AND '2011-12-21'
AND booking_status IN ('Confirmed', 'Cancelled', 'Rearranged')
AND invoice_number=''

可能是您的
给您带来了问题:

要重新格式化:

WHERE booking_date BETWEEN '2011-11-01' AND '2011-12-21' 
AND (booking_status = 'Confirmed' 
    OR booking_status = 'Cancelled' 
    OR booking_status = 'Rearranged') 
AND invoice_number=''
ORDER BY booking_date ASC
您可以添加括号以使其执行所需操作(如上所述),或者甚至可以在
子句中使用

WHERE booking_date BETWEEN '2011-11-01' AND '2011-12-21' 
AND booking_status IN ( 'Confirmed', 'Cancelled', 'Rearranged') 
AND invoice_number=''
ORDER BY booking_date ASC

+1绝对,在这种情况下,In运算符是最有效的。