SQL, где IS NULL, возвращает строки, в которых данные NOT NULL

Я пытаюсь получить все строки, в которых дата начала выше текущей даты или дата окончания выше текущей даты, а столбец whitepaper равен нулю.

По какой-то причине этот sql возвращает то, что я ожидаю, ЗА ИСКЛЮЧЕНИЕМ он также возвращает строки, в которых технический документ НЕ равен нулю, если я переверну sql и скажу, что технический документ НЕ НУЛЬ, он вернет все, как ожидалось, все те, где документ не равен нулю, а те, где технический документ является нулевым?

В «И» не следует ли указывать, что это должно быть заполнено?

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
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
103
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

ваш 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

Попробуйте заключить 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

Ну, вы не можете использовать вместе с выражением, также вы можете проверить пустые данные в поле 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

Спасибо, что вмешались, но с вашим сообщением возникли проблемы. Вы не объяснили, что вы сделали, чтобы помочь оператору увидеть его ошибку, или что отличает ваш ответ от тех, что были до вас. Кроме того, ваш код не отформатирован как код. Я не отвергаю ваш ответ, но другие могут, если вы немного не исправите его. stackoverflow.com/help/how-to-answer

Eric Brandt 20.04.2018 18:34
Ответ принят как подходящий

Как вам говорили другие, вы должны использовать круглые скобки вокруг условия ИЛИ.

Почему ? Поскольку OR имеет более низкий приоритет, чем 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

Другие вопросы по теме