2014-10-30 3 views
0

У меня есть 3 столбца, позвоните им column A, column B и column C каждый столбец - это дата.SQL - проблема с логикой WHERE

Я пытаюсь написать, где логика, как это:

Если столбец А NULL или если дата столбец C больше, чем сегодняшняя сегодня минус 3 дня
Если столбец B является NULL или если дата столбец С больше, чем сегодня сегодня минус 3 дня
Если столбец C является NULL или если дата столбец C больше, чем сегодняшняя сегодня минус 3 дня

Я придумал это, но когда я запускаю его, я недостающие элементы:

(columnA IS NULL OR columnA >= Dateadd(day, -3, Getdate())) 
AND 
(columnB IS NULL OR columnB >= Dateadd(day, -3, Getdate())) 
AND 
(columnC IS NULL OR columnC >= Dateadd(day, -3, Getdate())) 

Это вызывает конфликт, для примера, у меня есть один элемент, который отсутствует, и вот почему:

дата Columna составляет менее сегодняшнего дня минус 3 дня
дата columnB меньше, то сегодняшнего дня минус 3 дней
columnC является NULL

поэтому, поскольку columnC NULL, элемент должен отображаться. Что я делаю не так?

Спасибо,

Я использую SQL Server Management Studio 2008

+0

Это общий запрос. Они немного сложны, и производительность может быть абсолютно ужасной. Взгляните на эту статью, в которой объясняется ряд способов решения этого типа запросов. http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –

+2

@ user979331 вы использовали условие «И», которое будет извлекать данные только в том случае, если все 3 условия выполнены, недостающие данные, которые вы упомянули, не удовлетворяют условиям 1-го 2 не отображается на выходе. Используйте условие «ИЛИ» и посмотрите, работает ли оно. –

+1

Опубликуйте некоторые образцы данных, которые должны соответствовать вашим критериям, но это не так. – Andrew

ответ

1

Ваше описание проблемы и ваш код различаются в связи с «большим» предложением, поэтому ответ не является однозначным. Пожалуйста, уточните свой вопрос на случай - также см. Подсказки для оптимизации по прежнему комментарию.

а) Это должно быть логически правильный ответ на ваше описание:

WHERE (columnA IS NULL OR columnB IS NULL OR columnC IS NULL OR columnC >= Getdate()-3) 

б) производный от кода, то это должно быть логически правильный ответ (но еще не оптимизировано):

WHERE ( columnA IS NULL OR columnA >= Dateadd(day, -3, Getdate()) 
     OR columnB IS NULL OR columnB >= Dateadd(day, -3, Getdate()) 
     OR columnC IS NULL OR columnC >= Dateadd(day, -3, Getdate()) 
    ) 
2

Это звучит, как вы действительно хотите использовать OR, а не AND между вашими пунктами.

(columnA IS NULL OR columnA >= Dateadd(day, -3, Getdate())) 
OR 
(columnB IS NULL OR columnB >= Dateadd(day, -3, Getdate())) 
OR 
(columnC IS NULL OR columnC >= Dateadd(day, -3, Getdate())) 
+0

Это возвращает элементы, которые не должны быть там :( – user979331

+0

Затем отправьте некоторые данные образца. – programmer43229

0

Если столбец А NULL или если дата столбец C больше, чем сегодняшняя сегодня минус 3 дня Если столбец B является NULL или если дата столбец C больше, чем сегодняшняя сегодня минус 3 дня Если столбец C является NULL или если дата столбца C больше, чем сегодняшние сегодня минус 3 дня

(columnA IS NULL 
        OR columnC >= 
        Dateadd(day, -3, Getdate())) 
      AND (columnB IS NULL 
        OR columnC >= 
        Dateadd(day, -3, Getdate())) 
      AND (columnC IS NULL 
        OR columnC >= 
        Dateadd(day, -3, Getdate())) 

в случае, если вы хотите получить данные, которая удовлетворяет все три условия использования AND как вы используете еще, если вы хотите получить данные, соответствующие любой из использование условий OR вместо AND

Смежные вопросы