我想知道,如何在结果输出中创建显示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 ('sample@.gmail.com')
and s.sPID = 163 order by u.uEmailAddress asc
我想上面的查询输出所有数据但是免除记录,其中包含电子邮件地址= sample @ .gmail.com
当我执行上述查询时,输出仍然显示一条记录,其中包含以下email = sample @ .gmail.com。我错过了什么吗?
作为参考,这是我的sample@gmail.com记录在数据集中的内容:
email sPExpiryDate sExpiryDate sTExpiryDate
sample@.gmail.com NULL 2016-04-11 00:00:00.000 2012-03-03 00:00:00.000
请进一步咨询。感谢
答案 0 :(得分:3)
此处的问题可能是运营商优先级。如果在括号中包装WHERE子句的第一行,那么它能为您提供所需的内容吗?
WHERE (s.[sPExpiryDate]>= getdate() or s.[sExpiryDate] >= getdate() or [sTExpiryDate] >= getdate())
AND ...
可能发生的事情是,其中一个表达式正在评估为TRUE。那会使其余的检查短路。
注意到你有另一组OR的表达式。您可能还需要重新组织它们。
答案 1 :(得分:0)
我不确定你想要什么。您必须说出您想要过滤的内容以及您在问题中不想要的内容。我尽力猜测。
SELECT *
FROM [dbo].[UserDetails] u
INNER JOIN [dbo].[Subscriptions] s ON u.uID = s.sUID
WHERE u.uEmailAddress != 'sample@.gmail.com'
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