如何在sql中检查具有多个条件的列?

时间:2014-01-22 14:47:33

标签: mysql sql

我想检查多个条件的列。 列是

user_id    auction_id    status
  7            102         L
  7            103         W
  7            104         B
  7            105        null 

现在我想基于用户ID和状态选择auction_id,所以这是我写的初始代码

select auction_id 
from user_auction_rel 
where user_id =7 
  and status = 'B' 
   OR STATUS = NULL ;

结果是我得到了拍卖104,因为状态B是先给出的。 在网上退房后,我想出了这个代码

select auction_id 
from user_auction_rel 
where status in ('L' , 'W') 
group by user_id = 7;

但这也返回了类似的结果..只返回状态为L的拍卖ID ..所以我需要一个sql查询,它将能够根据这两种状态返回拍卖ID ..提前感谢..

4 个答案:

答案 0 :(得分:3)

第一次尝试有两个问题。首先,您无法将NULL与等于运算符进行比较。您必须改为使用STATUS IS NULL

其次,运营商优先权导致此处出现问题。您需要将status = 'B' OR STATUS IS NULL括在()组中。否则,AND的绑定比OR更紧密,您将得到错误的结果。

SELECT
  auction_id
FROM user_auction_rel
WHERE
  user_id =7
  AND (status = 'B' OR status IS NULL)
  /* or using the IN(): */
  /* AND (status = IN('L','W') OR status IS NULL) */

以下是演示:http://sqlfiddle.com/#!2/eb36e0/1

由于GROUP BY,您的第二次尝试失败了。由于查询中没有聚合(MAX(),MIN(),COUNT(),SUM()),因此没有理由使用GROUP BY。表达式group by user_id = 7实际上评估为GROUP BY 1,并且所有结果都组合在一起。如果在大多数其他RDBMS中出现错误,MySQL会允许它并为auction_id列提供不确定的结果集。

答案 1 :(得分:2)

括号是你的朋友。你的第一个疑问是:

select auction_id 
from user_auction_rel  
where user_id =7  
and status = 'B' 
OR STATUS = NULL 

但添加括号会完全改变含义

select auction_id 
from user_auction_rel  
where user_id =7  
and 
(
status = 'B' 
OR STATUS is NULL 
)

答案 2 :(得分:0)

查询应为:

从user_auction_rel中选择auction_id,其中user_id = 7且status ='B'或STATUS IS NULL;

通过此,您将获得状态为空且状态= B

的两行

答案 3 :(得分:0)

SELECT auction_id FROM user_auction_rel WHERE user_id =7 AND (status = 'B' OR status IS NULL);

由于AND优先,您需要将OR部分括在括号中。另外要检查空值,请使用IS NULL而不是= NULL