SQL其中IS NULL返回数据为NOT NULL的行

时间:2018-04-20 15:57:54

标签: mysql sql database

我试图获取开始日期高于当前日期或结束日期高于当前日期且白皮书列为空的所有行。

由于某种原因,这个sql返回我期望的内容除了它还返回白皮书为非NULL的行,如果我转动sql并说白皮书非NOT NULL它将返回所有那些白皮书不为null的所有内容而不是白皮书为空的那些?

'和'它是否应该指明必须填满?

SQL

SELECT id, 
       name, 
       whitepaper, 
       date_start, 
       date_end 
FROM approved 
WHERE  date_start >= CURDATE() OR date_end >= CURDATE() 
       AND whitepaper IS NULL 
ORDER BY date_end DESC 
LIMIT 10

4 个答案:

答案 0 :(得分:2)

正如其他人告诉你的那样,你必须在OR条件周围使用括号。

为什么? Because the OR has a lower priority than AND

没有括号,您的查询实际上是

 SELECT id, 
        name, 
        whitepaper, 
        date_start, 
        date_end  FROM approved  
 WHERE   date_start >= CURDATE() 
         OR
         ( 
           date_end >= CURDATE() 
           AND
           whitepaper IS NULL
         )
         ORDER BY date_end DESC  LIMIT 10

答案 1 :(得分:1)

OR应该在()中,请尝试以下内容:

 SELECT id, name, whitepaper, date_start, date_end 
    FROM approved 
    WHERE  (date_start >= CURDATE() OR date_end >= CURDATE())
     AND whitepaper IS NULL 
     ORDER BY date_end DESC LIMIT 10

答案 2 :(得分:1)

尝试将OR放在括号中:

SELECT id, name, whitepaper, date_start, date_end 
FROM approved 
WHERE  (date_start >= CURDATE() OR date_end >= CURDATE()) AND whitepaper IS NULL 
ORDER BY date_end DESC LIMIT 10

答案 3 :(得分:0)

你可以和表达一起使用你也可以在whitepaper字段中检查空数据这里是我的建议SELECT id, name, whitepaper, date_start, date_end FROM approved WHERE (date_start >= CURDATE() OR date_end >= CURDATE()) AND (ISNULL(whitepaper) or whitepaper='') ORDER BY date_end DESC LIMIT 10