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
这由运算符优先级规则解释:
如上所述,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 上的演示
为了清楚起见,我强烈建议使用带括号的版本。
归档时间: |
|
查看次数: |
595 次 |
最近记录: |