0

我的表架构如下:

                      +------+-------+-------+                                                                                                                                                         
                      | id   | name1 | name2 |                                                                                          
                      +------+-------+-------+                                                                                        
                      |    1 | A     | B     |
                      |    2 | A     | C     |
                      |    3 | B     | A     |
                      |    4 | C     | D     |
                      +------+-------+-------+

我正在使用如下查询:

          select * from t where name1='A' or name1='B' and name2='C';

结果如下

                       +------+-------+-------+
                       | id   | name1 | name2 |
                       +------+-------+-------+
                       |    1 | A     | B     |
                       |    2 | A     | C     |
                       +------+-------+-------+

这个结果是怎么来的?

我希望查询返回 name1 为AB且 name2 为'B' 的 行

查询结果应该是这样的

                       +------+-------+-------+
                       | id   | name1 | name2 |
                       +------+-------+-------+
                       |    1 | A     | B     |
                       +------+-------+-------+

我想要只使用“AND”和“OR”操作的查询结果......

4

5 回答 5

2

我建议您阅读有关布尔逻辑的信息。这是一个非常简单的操作,所以如果你熟悉 BL,你自己就可以做到这一点。

话虽如此,这两个状态将完成您想要的:

SELECT ... WHERE (name1 IN ('A', 'B')) AND (name2 = 'B')
SELECT ... WHERE ((name1 = 'A') or (name1 = 'B')) AND (name2 = 'B')
于 2012-11-15T14:52:26.230 回答
0

这是一个优先级问题。B 和 C 子句绑定在一起意味着你得到:

select * from t where name1='A' or (name1='B' and name2='B');

所以你需要做的是自己显式地绑定子句:

select * from t where (name1='A' or name1='B') and name2='B';

(假设您在陈述的查询中使用 C 是一个错字,因为它与您问题的其余部分不匹配)。

于 2012-11-15T14:54:16.263 回答
0

通过添加括号对您的条件进行分组

select * from t where (name1='A' or name1='B') and name2='B';

或使用IN

select * from t where name1 IN ('A','B') and name2='B';
于 2012-11-15T14:52:35.457 回答
0

你应该使用括号

select * from t where name1='A' or name1='B' and name2='C';

应该

select * from t where (name1='A' or name1='B') and name2='B';
于 2012-11-15T14:52:52.740 回答
0
   select * from t where (name1='A' or name1='B') and name2='B';
于 2012-11-15T14:53:04.713 回答