1. 问题

在今天的代码开发中,查询数据库的时候,我需要一个字段 即不是空,或者不是空字符串’’,

我在实际开发的过程中的SQL如下:

  1. SELECT
  2. count(distinct_id) AS count,
  3. DATE_FORMAT(happen_date,'%Y-%m-%d') AS date,
  4. search_keyword AS type
  5. FROM
  6. tdm_bas_view_details
  7. WHERE
  8. project_id='pid_1550737316860294'
  9. AND happen_date>='2019-06-20'
  10. AND happen_date<='2019-07-05'
  11. AND search_keyword IS NOT NULL
  12. OR search_keyword <> ''
  13. AND source_type='search_visit'

可以看出我在如下的位置,需要search_keyword既不为空,也或者不为空字符串

  1. AND search_keyword IS NOT NULL OR search_keyword <> ''

这样的写法导致了 AND search_keyword IS NOT NULL 之前的查询条件全部失效。

原因是 OR 将前后的查询条件分成了两个部分,并不是按照我的意向只是一个字段的两个值,从而导致查询的数据结果不正确。

2. 解决方案

如果需要对某个字段进行两种情况的判断的时候,要将多个OR用小括号括起来再和AND进行“与”,或者将多个AND用小括号括起来再与OR进行“或”。

所以,如上的代码需要改造成如下就OK了:

  1. SELECT
  2. count(distinct_id) AS count,
  3. DATE_FORMAT(happen_date,'%Y-%m-%d') AS date,
  4. search_keyword AS type
  5. FROM
  6. tdm_bas_view_details
  7. WHERE
  8. project_id='pid_1550737316860294'
  9. AND happen_date>='2019-06-20'
  10. AND happen_date<='2019-07-05'
  11. AND (search_keyword IS NOT NULL OR search_keyword <> '')
  12. AND source_type='search_visit'