2014-01-24 5 views
2

Запрос 2 часть:Как написать условия в предложении WHERE?

  1. отчеты должны упасть отчет _ * Если запись истекло И если * _ RecordStatus != 'Funded'.

  2. Запись должна оставаться на отчете _ ЕслиRecordStatus = 'Funded' * , не имеет *PURCHASEDATE, и если запись истекла (в прошлом от ** currentdate).

Я пытался сделать это с CASE, но этот запрос, как представляется булевой логики, следовательно, нецелесообразно. Я попытался заглянуть в IF...THEN...ELSE, но я потерялся, как это сделать. Я потратил 2 полных дня, пытаясь заставить это работать, и я ничего не придумал. Есть ли кто-нибудь, кто помогает мне в этом, а затем объясняет это?

Ниже приведен простой пример отказа (и да, я понимаю, это полный сбой из-за состояния, а не выражение):

Select distinct ... 
from ... --with joins 
where ... 
and case when RecordStatus != 'Funded' then getdate() <= EXPIRATIONDATE else ?? end 

Спасибо !!

+0

Итак, у вас есть «RecordStatus», который имеет статус «Funded» или что-то еще, и у вас есть «PurchaseDate», у которого есть значение даты или «null». Является ли дата истечения срока действия столбцом или это параметр, который вы указываете в запросе? –

+2

используйте 'AND' &' OR' в предложении where для ваших условий. –

ответ

3

Требований кажется подозрительным мне, но здесь не мой взгляд на него (нет «условной логики» требуется), и почему это кажется «подозрительным», если я правильно читать его ..

Записи должны оставаться в отчете If RecordStatus = «Funded», не имеет ПОКУПКИ, и если срок действия записи истек (в прошлом это значение currentdate).

RecordStatus = 'Funded' 
AND PurchaseDate IS NULL 
AND ExpiredDate < CURRENT_TIMESTAMP 

отчеты должны упасть отчет Если запись истекло И если RecordStatus! = 'Финансируемые.

NOT (HasExpired AND RecordStatus <> 'Funded') 

Комбинированный:

RecordStatus = 'Funded' 
AND PurchaseDate IS NULL 
AND ExpiredDate < CURRENT_TIMESTAMP 
AND NOT (HasExpired AND RecordStatus <> 'Funded') 

С преобразованием Де Моргана:

RecordStatus = 'Funded' 
AND PurchaseDate IS NULL 
AND ExpiredDate < CURRENT_TIMESTAMP 
AND (NOT HasExpired OR RecordStatus = 'Funded') 

Устранение входящие состояния после распределения.

RecordStatus = 'Funded' 
AND PurchaseDate IS NULL 
AND ExpiredDate < CURRENT_TIMESTAMP 
AND NOT HasExpired 

Однако, если предположить, что HasExpired такое же, как ExpiredDate < CURRENT_TIMESTAMP

RecordStatus = 'Funded' 
AND PurchaseDate IS NULL 
AND ExpiredDate < CURRENT_TIMESTAMP 
AND NOT ExpiredDate < CURRENT_TIMESTAMP 

Что, конечно, никогда не является истинным, и почему я подозреваемый.

+0

Поскольку у ОП возникают проблемы с предложением WHERE, я подозреваю, что DMT, вероятно, немного продвинулся - но +1 для деталей – Basic

+1

Спасибо за помощь! Я определенно делал это сложным, и трехдневный уик-энд определенно помог после прочтения ваших комментариев. Я понятия не имел о DMT, поэтому я просмотрел его, и это было определенно полезно. Сейчас все отлично работает, и бизнес счастлив! – user3229496

2

Вы считаете текущие критерии немного обманчивыми.

Вы говорите, что в одном случае он должен упасть с отчета, а в другом случае он должен оставаться включенным, но вы имеете в виду разный статус ».

Мне нравится думать о вещах, которые я хочу увидеть в SQL-запросе.

Итак, я хочу видеть статус «Финансирование», и я хочу, чтобы PurchaseDate's null.

SELECT ... 
FROM ... 
WHERE (RecordStatus = 'Funded' AND purchaseDate IS NULL) 

Если вы хотели видеть записи RecordStatus! = «Финансируемые», но только если запись является текущей, то добавьте OR

WHERE (RecordStatus = 'Funded' AND purchaseDate IS NULL) OR 
     (RecordStatus != 'Funded' AND getDate() <= ExpirationDate) 
0

Обычно вы строите свою логику в том, где и достаточно избегать использования СЛУЧАЙ или, если это не производительность мудрым

... 
NOT (RecordStatus != 'Funded' AND getdate() > EXPIRATIONDATE) OR 
(PURCHASEDATE IS NULL AND RecordStatus = 'Funded' AND getdate() > EXPIRATIONDATE) 

Вы можете оптимизировать его дальше:

... 
RecordStatus = 'Funded' OR getdate() <= EXPIRATIONDATE OR 
PURCHASEDATE IS NULL 
Смежные вопросы