如何解决“IS NOT NULL”未在 mySQL 中产生所需的结果
我正在尝试根据我的表格构建报告。这是我的桌子:
func1
我希望排除具有所有空值的条目,以下是我的语法,但它不起作用并产生相同的结果。
Func<object,object> func2 = o => o is bool f ? func1(f) : null;
请在此处提供帮助或分享可以提供帮助的帖子。我一直在努力寻找但
解决方法
不要对列名/别名使用单引号,因为例如 'Training Break'
之类的表达式中的 'Training Break' IS NOT NULL
被解释为字符串文字,当然它不为空。
在 MySql 中,您可以使用反引号将列名括起来。
此外,Training Break
、Short Break 1
、Short Break 2
和 Long Break
列是聚合函数的结果,因此它们不能用于 WHERE
条款。而是使用 HAVING
子句。
最后,由于您想要这些列中至少有 1 个不为空的行,您应该使用运算符 OR
而不是 AND
:
FROM
`vicidial_agent_log`
GROUP BY `user`
HAVING `Training Break` IS NOT NULL
OR `Short Break 1` IS NOT NULL
OR `Short Break 2` IS NOT NULL
OR `Long Break` IS NOT NULL
或者:
FROM
`vicidial_agent_log`
GROUP BY `user`
HAVING COALESCE(`Training Break`,`Short Break 1`,`Short Break 2`,`Long Break`) IS NOT NULL
,
首先,将 SUM()
表达式的公共部分移到 WHERE
子句中。
其次,修正日期逻辑,让您不会错过任何一秒。
我也强烈推荐使用不需要转义的列名。所以:
SELECT user,SUM(CASE WHEN sub_status` = 'TB' THEN pause_sec END) AS Training_Break,SUM(CASE WHEN sub_status = 'SB1' THEN pause_sec END) AS Short_Break_1,SUM(CASE WHEN sub_status = 'SB2' THEN pause_sec END) AS Short_Break_2,SUM(CASE WHEN sub_status = 'LB' THEN pause_sec END) AS Long_Break
FROM vicidial_agent_log
WHERE event_time >= '2021-04-01' AND
event_time < '2021-04-17'
GROUP BY user;
这可能会消除 NULL
值并加快查询速度。但是,如果整行中仍有 NULL
值,那是因为有些行不具有这些状态之一。因此,只需检查它们:
SELECT user,SUM(CASE WHEN sub_status = 'LB' THEN pause_sec END) AS Long_Break
FROM vicidial_agent_log
WHERE event_time >= '2021-04-01' AND
event_time < '2021-04-17' AND
sub_status IN ('TB','SB1','SB2','LB')
GROUP BY user;
SQL 非常强大,可以让您在聚合之前或之后进行过滤。但是,在聚合之前进行过滤通常会更好(从性能角度来看)。
我还建议您使用不需要转义的标识符。并且,切勿对字符串和日期文字以外的任何内容使用单引号。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。