SQL WHERE子句逻辑不匹配

时间:2018-08-10 20:12:12

标签: mysql sql

我有一个包含以下信息的数据库表

+----+--------+--------+--------+
| id | status | action | reason |
+----+--------+--------+--------+
|  1 | CN     | WAPP   | BDEC   |
|  2 | CN     | DENY   | PREF   |
|  3 | AP     | APPL   | MI     |
|  4 | AP     | MATR   | AUTO   |
+----+--------+--------+--------+

已使用特定过滤器编写了从该表中选择数据的MySQL查询,以排除所有与CN-WAPP-BDEC匹配的记录。

SELECT *
FROM   `table`
WHERE  (`status` != 'CN' AND `action` != 'WAPP' AND `reason` != 'BDEC');

但是,它只返回记录3和4,记录#2也被排除。

如果我将查询更改为:

SELECT *
FROM   `table`
WHERE  CONCAT(`status`, `action`, `reason`) != 'CNWAPPBDEC';

只有这样,我才能得到预期的结果:记录2、3和4。

据我所知,查询都应该做完全相同的事情,但是显然不是,我对此感到困惑。任何见识将不胜感激。

2 个答案:

答案 0 :(得分:2)

记录2被排除在外是因为status = CN,这使得第一个条件status != 'CN'为假。

尝试一下:

SELECT *
FROM   `table`
WHERE  (NOT (`status` == 'CN' AND `action` == 'WAPP' AND `reason` == 'BDEC'));

答案 1 :(得分:1)

我认为您想要OR,而不是AND

SELECT t.*
FROM  `table` t
WHERE `status` <> 'CN' OR `action` <> 'WAPP' OR `reason` <> 'BDEC';

您还可以使用元组对此进行措辞:

WHERE (status, action, reason) not in ( ('CN', 'WAPP', 'BDEC') );