未加括号的 OR 中的 AND 条件有效,但为什么呢?

Joh*_*ohn 6 sql-server sql-server-2008-r2

我的代码与下面的第一个块非常相似。它正在一个关键过程中投入生产,我不相信它会一直有效。我想知道为什么会这样。它用于or (1=1)and条件集进行分组。我担心如果更改 SQL 版本,返回的结果会发生变化。

这是我用于测试的简单表格:

编号 说明
1 一
2 两个
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
11 十一

此代码有效,但我不知道为什么:

SELECT [Id] ,[Description]
FROM [Seminars].[dbo].[CodeTable]
    where (1=1)
    and Id = 1 
    and Description = 'One'
    or (1=1)
    and Id = 7
    and Description = 'Seven'
    or (1=1)
    and Id = 3
    and Description = 'Three'
Run Code Online (Sandbox Code Playgroud)

它返回:

编号 说明
1 一
3 三
7 七

这是使用括号的传统代码(我希望可以使用):

SELECT TOP 1000 [Id], [Description]
FROM [Seminars].[dbo].[CodeTable]
where 
    (Id = 1  
    and Description = 'One')
or 
    (Id = 7 
    and Description = 'Seven')
or 
    (Id = 3
    and Description = 'Three')
Run Code Online (Sandbox Code Playgroud)

返回相同的结果。

Pau*_*ite 16

这由运算符优先级规则解释:

运算符优先级 (Transact-SQL)

如上所述,AND具有比 更高的评估优先级OR

1 = 1查询的部分是多余的(并被优化器删除)。你同样可以写成:

DECLARE @Test AS table
(
    Id integer PRIMARY KEY,
    [Description] varchar(10) UNIQUE
);

INSERT @Test
    (Id, [Description])
VALUES
    (1, 'One'),
    (2, 'Two'),
    (3, 'Three'),
    (4, 'Four'),
    (5, 'Five'),
    (6, 'Six'),
    (7, 'Seven'),
    (8, 'Eight'),
    (9, 'Nine'),
    (10, 'Ten'),
    (11, 'Eleven');

SELECT
    T.Id,
    T.[Description]
FROM @Test AS T
WHERE 
    T.Id = 1 AND T.[Description] = 'One'
    OR Id = 7 AND T.[Description] = 'Seven'
    OR Id = 3 AND T.[Description] = 'Three';
Run Code Online (Sandbox Code Playgroud)

出于相同的原因(优先级),这会产生相同的结果:

结果

Stack Exchange Data Explorer 上的演示

为了清楚起见,我强烈建议使用带括号的版本。