我在SQL Server 2008中手工编写了一个简单的SQL,如下所示;
SELECT * FROM Tab1 WHERE
A='1' AND (B='1' OR C='1');
懒惰我在查询编辑器中打开此查询以验证语法并在对话框上按下OK而不进行任何更改。
我注意到查询编辑器已将我的查询更改为:
SELECT * FROM Tab1 WHERE A='1' AND (B='1') OR (C='1');
显然这会改变SQL的逻辑并根据您执行的操作返回不同的结果。
我经常使用查询编辑器来验证复杂查询的语法。所以有点担心像这样的微妙变化会变得没有意义,但会改变结果。
这是设计师的特色吗?我有什么办法可以改变这种行为吗?
编辑:感谢您指出编辑器所做的更改与上述不完全相同,但仍然会修改查询,但结果是相同的。
由于
答案 0 :(得分:3)
我试图在查询设计器中复制它,结果略有不同。我打字的方式和你一样:
SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1');
得到了这个:
SELECT *
FROM Tab1
WHERE (A = '1') AND (B = '1') OR
(A = '1') AND (C = '1')
我必须说结果是一样的,但我们都可以在这里看到危险之路。另外,我不喜欢(A = '1')
复制。哎呀,我想要代码如何编码它!
明智的一句话:我从不格式化SQL Server Management Studio中的查询。你有没有看到它对你的视图代码的作用?我讨厌它。我只是在其他地方编码并在完成后粘贴短信。
答案 1 :(得分:2)
声明
SELECT * FROM Tab1 WHERE A='1' AND (B='1' OR C='1')
让我解决:
SELECT * FROM Tab1 WHERE (A='1') AND (B='1') OR (A='1') AND (C='1')
这是令人惊讶的正确,因为在SQL Server TSQL中AND
运算符优先于OR
。这意味着上面的内容与以下相同,因为AND
- 运算符在OR
- 运算符之前得到了评估:
SELECT * FROM Tab1 WHERE ((A='1') AND (B='1')) OR ((A='1') AND (C='1'))
这与问题中使用的初始陈述相同。
有关详细信息,请参阅Operator Precedence (Transact-SQL)。