【问题标题】:MySql how COUNT(column_name = 'foobar' or null) works?MySql COUNT(column_name = 'foobar' or null) 如何工作?
【发布时间】:2021-07-27 21:01:52
【问题描述】:

我想了解or null 在此示例中的工作原理:

Select columnA, count(columnB = 'foobar' or null) as result 
from orders 
group by columnA

如果我不使用or null,那么它只会根据group by 给出columnB 的计数(*),但使用or null 它会给出正确的值计数,其中columnB = 'foobar'

只是想知道它在内部是如何工作的?

【问题讨论】:

  • 它为匹配 foobar 的行返回 1,为不匹配的行返回 null(而不是 0)。 COUNT() 不计算空值(但它确实计数为 0),因此它相当于 SUM(columnB = 'foobar') [或 SUM(CASE WHEN columnB = 'foobar' THEN 1 ELSE 0 END)]

标签: mysql count boolean-logic sql-null


【解决方案1】:

假设columnB 不可为空,则表达式:

columnB = 'foobar'

是一个布尔表达式,对于 true0 对于 false 评估为 1

所以在这里使用COUNT()

count(columnB = 'foobar')

它相当于count(0)count(1) 两者都返回相同的结果:

表格的所有行数(就像count(*)

因为COUNT() 的参数永远不是NULL

表达式:

columnB = 'foobar' or null

也是一个布尔表达式,但是当columnB = 'foobar'false时它也可以被评估为nullfalse or nullnull,而true or nulltrue)。

所以在这里使用COUNT()

count(columnB = 'foobar' or null)

它只计算columnB = 'foobar'true 的行,因为对于所有其他columnB = 'foobar' or nullnull

虽然您的代码有效,但我更喜欢使用条件聚合,例如:

count(case when columnB = 'foobar' then 1 end)

或:

sum(columnB = 'foobar') -- works in MySql and SQLite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2012-04-04
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多