如何用纯MySQL高效统计单行内非空列的数量?
高效统计单行非空列数量的MySQL实现
嘿,完全懂你那种多次查询累加的痛苦——既冗余又低效,其实用一次MySQL查询就能搞定,根本不用写重复的PHP脚本!
核心思路很简单:在单条查询里对每一列做非空判断,把符合条件的列转化为1,不符合的转化为0,最后将这些数值相加,得到的结果就是非空列的总数。
具体实现代码
假设你的表名为your_table,要查询的行id=X,可以用下面的SQL:
SELECT ( IF(col1 IS NOT NULL AND col1 != '', 1, 0) + IF(col2 IS NOT NULL AND col2 != '', 1, 0) + IF(col3 IS NOT NULL AND col3 != '', 1, 0) + IF(col4 IS NOT NULL AND col4 != '', 1, 0) + IF(col5 IS NOT NULL AND col5 != '', 1, 0) + IF(col6 IS NOT NULL AND col6 != '', 1, 0) ) AS non_empty_count FROM your_table WHERE id = X;
代码说明
- 每个
IF语句会检查对应列:如果列值不是NULL且不是空字符串,就返回1,否则返回0; - 把所有列的判断结果相加,最终得到的
non_empty_count就是你要的非空列数量(对应你示例里的结果4); - 整个过程只需要一次数据库查询,避免了多次连接、查询的开销,效率提升非常显著。
如果你更喜欢用CASE语句(可读性可能更强一点),也可以写成这样:
SELECT ( CASE WHEN col1 IS NOT NULL AND col1 != '' THEN 1 ELSE 0 END + CASE WHEN col2 IS NOT NULL AND col2 != '' THEN 1 ELSE 0 END + CASE WHEN col3 IS NOT NULL AND col3 != '' THEN 1 ELSE 0 END + CASE WHEN col4 IS NOT NULL AND col4 != '' THEN 1 ELSE 0 END + CASE WHEN col5 IS NOT NULL AND col5 != '' THEN 1 ELSE 0 END + CASE WHEN col6 IS NOT NULL AND col6 != '' THEN 1 ELSE 0 END ) AS non_empty_count FROM your_table WHERE id = X;
两种写法效果完全一致,选你觉得顺手的就行。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

