如何查询 - 不应包含

时间:2015-03-31 15:38:19

标签: sql-server tsql

我想知道,如何在结果输出中创建显示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

请进一步咨询。感谢

2 个答案:

答案 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