Sql server 使用NULL时与AND和OR混淆

Sql server 使用NULL时与AND和OR混淆,sql-server,Sql Server,我不是一个受过SQL训练的人,但我通常可以编写基本的查询。但这让我感到困惑 该表的一个子集是: fldUID (auto-increment unique) fldSrcAddress fldDstAddress fldSrcDNSHost fldDstDNSHost 我正在尝试检索具有fldSrcAddress或FLDDStatAddress的记录的fldUID,并且fldSrcDNSHost为NULL或FLDDSDNSHOST为NULL 我的问题是: SELECT top 1 fldUID

我不是一个受过SQL训练的人,但我通常可以编写基本的查询。但这让我感到困惑

该表的一个子集是:

fldUID (auto-increment unique)
fldSrcAddress
fldDstAddress
fldSrcDNSHost
fldDstDNSHost
我正在尝试检索具有fldSrcAddress或FLDDStatAddress的记录的fldUID,并且fldSrcDNSHost为NULL或FLDDSDNSHOST为NULL

我的问题是:

SELECT top 1 fldUID, fldSrcAddress, fldDstAddress
From tbl_ExtLog_FirewallTraffic
Where fldSrcAddress Is Not Null or fldDstAddress is not null
And (fldSrcDNSHost Is Null Or fldDstDNSHost is null )
order by fldUpdateTimeStamp asc
但查询返回fldUID 32831,即:

Example Data: 
fldUID = 32831
fldSrcAddress = 192.168.1.100
fldDstAddress = 192.168.2.69
fldSrcDNSHost = Asus
fldDstDNSHost = Lucifer
字段2和字段3都有数据(这样才有意义)。但字段4和5也有数据,但我的查询试图查找字段4或5为空的记录

显然这是一个愚蠢的错误——任何帮助都将不胜感激

谢谢


伊恩

这可能是括号的问题

试试这个:

SELECT top 1 fldUID, fldSrcAddress, fldDstAddress
From tbl_ExtLog_FirewallTraffic
Where (fldSrcAddress Is Not Null OR fldDstAddress is not null)
And (fldSrcDNSHost Is Null Or fldDstDNSHost is null )
order by fldUpdateTimeStamp asc

行得通——现在我觉得自己很傻。我试着在和的前面和末尾加上一个括号,但我没想到把它们放在前两个条件附近。现在我看它有道理了!谢谢。第三组眼睛有时会有帮助:)现在试着找出为什么没有括号你会得到那条记录。:-)没有括号,它不会处理第一条语句(fldSrcAddress不是Null)-它返回fldSrcAddress不是Null的第一行?谢谢你提出这个问题-它帮助我理解我做错了什么:-)