今天写sql的时候,发现当某个字段的值为‘0’,‘1’,或者数据库默认的null的时候,用“!=”查询,结果集中是不包含null的
假如你这样写
SELECT
*
FROM
common_message
WHERE
message_category = 'READ'
AND message_status != '0'
查询出来的结果集是这样的:
然后我想,既然他缺少包含null的,我在用or拼接一下不就大功告成了嘛,遂把sql改成了这样,发现结果集还是不行,真是崩溃。
假如你这样写
SELECT
*
FROM
common_message
WHERE
message_category = 'READ'
AND message_status != '0' or message_status IS NULL
查询出来的结果确实这样的
你会发现结果集中不仅包含READ还包含OPERATE,oh my god,我的and条件竟然失效了。
假如你这个时候你给or拼接的条件加个“()”,你会惊奇的发现,and有起作用了
SELECT
*
FROM
common_message
WHERE
message_category = 'READ'
AND (message_status != '0' or message_status IS NULL)
PS:原因是and和or优先级一样,sql执行的时候按照顺序,所以结果集就不对了,如果加了“()”之后,优先级高了,就会先查找不等于0的和为null的,然后在这个基础上进行and条件的查询。