2015-03-31 63 views
0

我想弄清楚,我怎么可以创建查询,显示所有的where子句中的结果,但不包括一个电子邮件地址,在结果输出:如何查询 - 不应该包含

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 

我想要上面的查询输出所有数据但是免除记录,其中包含电子邮件地址= sample @ .gmail.com

当我执行上述查询时,输出仍然显示一条记录,其中包含以下email =品尝@ .gmail.com。我错过了什么吗?

为参照,这就是我[email protected]记录类似于INT数据集:

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 – 2015-03-31 15:54:57

+1

是“(s。 [sB_All] ='1'或s。[sB_All] <>'1')'偷偷写作's。[sB_All]不是NULL'? – HABO 2015-03-31 16:06:10

回答

3

您在这里的问题可能是运营商的优先顺序。如果将WHERE子句的第一行用括号括起来,那么是否给了你想要的?

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

可能发生的情况是,其中一个表达式正在评估为TRUE。这会使其余的检查短路。

只是注意到你有另一套OR的表达式。你可能也需要重新组织这些。

+0

谢谢你的回复。我已经尝试了上面的查询,通过在第一个where子句中添加括号,但它不显示正确的输出数,它应该给我375(不包括电子邮件记录),但是当我添加括号时,它会显示我370输出。 – user3070072 2015-03-31 15:50:03

+0

我不认为你应该需要一个嵌套查询。看看上面提到的Aaron链接。另外,请确保您正确处理sB_All和sStories_only的中间检查。你也有可能会导致你问题的ORs。 – 2015-03-31 16:04:59

+0

@ user3070072:请仔细阅读答案。它提到你有另一组与OR相关的谓词。细看。考虑到亚伦的评论。在可能出现混淆的地方指定括号。 – 2015-03-31 16:05:08

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