SQL WHERE Field1> = 1 OR Field2> = 1允许(null)值

时间:2016-09-21 19:01:38

标签: sql oracle

我试图查询数据库表并在我的查询中包含以下WHERE子句:

WHERE (QTY_ON_HAND >= 1 OR QTY_ON_ORDER >= 1);

我想要退回所有手头有数量或订购数量的结果。

但是,这允许返回具有0 QTY_ON_HAND(null) QTY_ON_ORDER

的记录

通过结果滚动,它甚至允许-1(以及其他底片)和NULL

enter image description here

以下是WHERE子句的其余部分:

    WHERE CHARGE_CODE = 'RETAIL' OR CHARGE_CODE = 'RETAILSN' AND
      LOCATION = 100 AND
      SPA_ITEM_ID LIKE '1%' AND
      (QTY_ON_HAND >= 1 OR QTY_ON_ORDER >= 1);

解决方案:

在第一个WHERE子句

上忘记括号
CHARGE_CODE = 'RETAIL' OR CHARGE_CODE = 'RETAILSN'

需要

(CHARGE_CODE = 'RETAIL' OR CHARGE_CODE = 'RETAILSN')

2 个答案:

答案 0 :(得分:3)

AND运算符优先于OR,因此您需要使用括号:

WHERE 
   ( CHARGE_CODE = 'RETAIL' OR CHARGE_CODE = 'RETAILSN' )
   AND LOCATION = 100
   AND SPA_ITEM_ID LIKE '1%'
   AND ( QTY_ON_HAND >= 1 OR QTY_ON_ORDER >= 1 )

更好地使用IN运算符:

WHERE 
   CHARGE_CODE IN( 'RETAIL', 'RETAILSN' )
   AND LOCATION = 100
   AND SPA_ITEM_ID LIKE '1%'
   AND ( QTY_ON_HAND >= 1 OR QTY_ON_ORDER >= 1 )

有关此问题的更多信息,请参见documentation

答案 1 :(得分:1)

尝试:

WHERE
    CHARGE_CODE IN ('RETAIL','RETAILSN') AND
    LOCATION = 100 AND
    SPA_ITEM_ID LIKE '1%' AND
    (QTY_ON_HAND >= 1 OR QTY_ON_ORDER >= 1);

希望它有帮助!