Sql server 在SQL查询中同时使用和/或

Sql server 在SQL查询中同时使用和/或,sql-server,Sql Server,我只需要显示ship_状态为final且field1不为null或field2不为null的记录。ship_status=final是必须的字段1/field2为或,但必须为真。但是当我尝试查询时,它会返回所有结果吗 Create Table #123 ( ID int, ship_status varchar(100), field2 varchar(100), field3 varchar(100) ) Insert Into #123 Values ('1','Final

我只需要显示ship_状态为final且field1不为null或field2不为null的记录。ship_status=final是必须的字段1/field2为或,但必须为真。但是当我尝试查询时,它会返回所有结果吗

Create Table #123
(
  ID int,
  ship_status varchar(100),
  field2 varchar(100),
  field3 varchar(100)
)

Insert Into #123 Values
('1','Final', 'No', 'Null'),
('2', 'Test', 'Null', 'Null'),
('3','Null', 'Null', 'Null'),
('4','Null', 'Null', 'Null'),
('5','Final', 'Null', 'No'),
('6','Final', 'Null', 'No'),
('7','Final', 'Null', 'No')

Select * from #123
WHERE field2 IS NOT NULL OR field3 IS NOT NULL
AND ship_status IN ('Final')
您需要使用括号将OR逻辑分组,如下所示:

Select * from #123
WHERE (field2 IS NOT NULL OR field3 IS NOT NULL)
      AND ship_status IN ('Final')
另外,如果您只是搜索单个状态,我会将AND部分更改为相等检查:

ship_status = 'Final'

正是@Tanner所说的。SQL中的逻辑操作具有执行优先级,因此其优先级高于或
此处有更多详细信息:

首先检查您的数据,它应该是:

Insert Into #123 Values
('1','Final', 'No', Null),
('2', 'Test', Null, Null),
('3','Null', Null, Null),
('4','Null', Null, Null),
('5','Final', Null, 'No'),
('6','Final', Null, 'No'),
('7','Final', Null, 'No')
如果是,您的查询可能是:

Select ID, ship_status, field2, field3 from #123
WHERE (field2 IS NOT NULL OR field3 IS NOT NULL)
AND ship_status = 'Final'
否则,将使用字符串值为Null的varchar。在这种情况下:

Select ID, ship_status, field2, field3 from #123
WHERE (field2 <> 'NULL' OR field3 <> 'NULL')
AND ship_status = 'Final'