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 值的主要内容,如果未能解决你的问题,请参考以下文章