代码之家  ›  专栏  ›  技术社区  ›  ii iml0sto1

SQL where IS NULL返回数据不为NULL的行

  •  1
  • ii iml0sto1  · 技术社区  · 7 年前

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

    出于某种原因,此sql返回我所期望的结果,除了它还返回白皮书不为NULL的行,如果我将sql转过来并说白皮书不为NULL,它将按预期返回所有内容白皮书不为NULL的所有行和白皮书不为NULL的行?

    “And”是否应该指定必须填写?

    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 回复  |  直到 7 年前
        1
  •  2
  •   Luc M    7 年前

    正如其他人告诉您的,必须在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
    
        2
  •  1
  •   flyingfox    7 年前

    你的 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
  •  1
  •   nacho    7 年前

    尝试将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
    
        4
  •  0
  •   A Singh    7 年前

    您可以将isnull与表达式一起使用,也可以检查白皮书字段中的空数据。这是我的建议 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