MySQL 在 WHERE 语句中使用 COALESCE 或 IFNULL 选择非 NULL 值

Posted

技术标签:

【中文标题】MySQL 在 WHERE 语句中使用 COALESCE 或 IFNULL 选择非 NULL 值【英文标题】:MySQL select non-NULL values with COALESCE or IFNULL in a WHERE statement 【发布时间】:2017-02-23 16:13:38 【问题描述】:

我正在一个表中构建一个摘要,我自连接以计算某些值对应的行(在 TikiWiki CMS,跟踪器应用程序中)。但是我有一个情况,有两列可以具有相同的值,我需要 SQL 以特定顺序获取第一个非 NULL 值。

这是我工作的表tiki_tracker_item_fields 的示例:

 itemId  | fieldId  | value   
==========================
41       | 236      | Paris   
41       | 213      | Paris  
14       | 236      |         
14       | 213      | Paris  
25       | 236      | Paris     
25       | 213      |       

在查询中,我想计算字段 ID 236 或字段 ID 213 中所有以“Paris”为值的行。这里的结果应该是:3。

这是我的要求:

 SELECT COUNT(*) AS sp_actions           
FROM                                    
  `tiki_tracker_item_fields` AS actions 
WHERE                                   
  COALESCE(                             
    actions.fieldId = 236,              
    actions.fieldId = 213               
  )                                     
AND actions.value = 'Paris'                  

因此,当我为字段 236 设置“巴黎”时,此方法有效,但当我为字段 213 设置巴黎时,此方法无效。

我什至不确定我是否可以这样使用 COALESCE,我发现的所有示例都将 COALESCE 放在 SELECT 语句中。

然后是性能问题...

【问题讨论】:

【参考方案1】:

您可以将count (distinct)case 一起使用:

select 
    count(distinct case when value = 'Paris' then itemId end) cnt
from `tiki_tracker_item_fields`
where fieldId in (236,213);

【讨论】:

太棒了!像魅力一样工作,而且速度很快。谢谢!现在我必须围绕你的例子来理解它是如何工作的,尤其是THEN itemId END 部分。 另外我想知道是否可以/建议在 WHERE 语句中使用控制流函数...

以上是关于MySQL 在 WHERE 语句中使用 COALESCE 或 IFNULL 选择非 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

在mysql select语句中使用条件where子句

在 SQL/MySQL 中,join 语句中的“ON”和“WHERE”有啥区别?

MySQL 查询在 WHERE 语句中使用 OR 很慢

8.2.1.2-MySQL如何优化 WHERE 语句

MySQL-过滤数据(WHERE语句)

mysql中使用 where 1=1和 0=1 的作用