2015-03-31 2 views
0

Я пытаюсь понять, как я могу создать запрос, который показывает все результаты где статей, но не включают в себя один адрес электронной почты, на выходе результат:Как запросить - не должны содержать

select * from [dbo].[UserDetails] u join [dbo].[Subscriptions] s on u.uID = s.sUID 
where s.[sPExpiryDate]>= getdate() or s.[sExpiryDate] >= getdate() or [sTExpiryDate] >= getdate() 
and (s.[sB_All] = '1' or s.[sB_All] <> '1') or [sStories_Only] = 1 
and u.uEmailAddress not in ('[email protected]') 
and s.sPID = 163 order by u.uEmailAddress asc 

I хотел бы, чтобы вышеупомянутый запрос выводил все данные, но освобождал запись, которая содержит адрес электронной почты = пример @ .gmail.com

При выполнении вышеуказанного запроса на выходе по-прежнему отображается запись со следующим адресом электронной почты = образец @ .gmail.com. я что-то упускаю?

в качестве ссылки, это то, что мой [email protected] запись выглядит ИНТ набора данных:

email    sPExpiryDate sExpiryDate      sTExpiryDate 
[email protected] NULL   2016-04-11 00:00:00.000   2012-03-03 00:00:00.000 

Пожалуйста, советы далее. спасибо

+2

Подумайте о том, чтобы говорить по-английски. «Я бы хотел ветчину, яйца или тосты». Означает ли это, что вы хотите «ветчину и (яйца или тосты)» или «(ветчину и яйца) или тосты»? См. Http://databases.aspfaq.com/general/why-do-i-get-weird-results-when-using-both-and-and-or-in-a-query.html –

+1

Is '(s. [sB_All] = '1' или s. [sB_All] <> '1') 'непростой способ записи' s. [sB_All] не NULL'? – HABO

ответ

3

Ваша проблема здесь может быть приоритетом оператора. Если вы заключите первую строку предложения WHERE в круглые скобки, это даст вам то, что вы хотите?

WHERE (s.[sPExpiryDate]>= getdate() or s.[sExpiryDate] >= getdate() or [sTExpiryDate] >= getdate()) 
AND ... 

Что, вероятно, происходит в том, что одно из этих первых выражений оценивает значение ИСТИНА. Это приведет к короткому замыканию остальных проверок.

Только что заметил, что у вас есть другой набор выражений OR'd. Возможно, вам также придется реорганизовать их.

+0

Благодарим вас за ответ. Я уже пробовал вышеуказанный запрос, добавив круглые скобки вокруг первого предложения where, но он не показывает мне правильное количество вывода, он должен дать мне 375 (исключая запись электронной почты), но когда я добавляю круглые скобки, это показывает мне 370. – user3070072

+0

Я не думаю, что вам нужен вложенный запрос. Взгляните на приведенную выше ссылку Aaron. Кроме того, убедитесь, что вы обрабатываете эту среднюю проверку вокруг sB_All и sStories_only правильно. У вас есть ORs, смешанные там, которые потенциально могут вызывать проблемы. –

+0

@ user3070072: Пожалуйста, внимательно прочитайте ответ. В нем упоминается, что у вас есть другой набор предикатов, связанных с OR. Присмотритесь. Учитывайте также комментарий Аарона. Укажите круглые скобки в местах, где возможна путаница. –

0

Я не уверен, что вы хотите. Вам нужно будет сказать, что вы хотите фильтровать и чего не хотите в своем вопросе. Я сделал все возможное.

SELECT * 
FROM [dbo].[UserDetails] u 
INNER JOIN [dbo].[Subscriptions] s ON u.uID = s.sUID 
WHERE u.uEmailAddress != '[email protected]' 
     AND s.sPID = 163 
     AND 
     (
      s.[sPExpiryDate] >= getdate() 
      OR s.[sExpiryDate] >= getdate() 
      OR [sTExpiryDate] >= getdate() 
     ) 
     AND 
     (
     s.[sB_All] IS NOT NULL 
     OR [sStories_Only] = 1 
     ) 
ORDER BY u.uEmailAddress ASC 
Смежные вопросы