当结果(在本例中为lessons.classDate)不存在时,尝试停止此查询返回NULL。我确定COALESCE应该被包裹,但我无法正确理解语法。
SELECT FLOOR(COUNT(S0001)* 100 /
(SELECT COUNT(*) FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(CURDATE(),INTERVAL -12 WEEK))
) AS stat12wkMod1
FROM attendance_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(CURDATE(),INTERVAL -12 WEEK);
我在努力;
SELECT FLOOR(COUNT(S0001)* 100 /
COALESCE(SELECT COUNT(*) FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(CURDATE(),INTERVAL -12 WEEK)),0)
) AS stat12wkMod1
FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(CURDATE(),INTERVAL -12 WEEK);
[编辑] 工作版,适合那些感兴趣的人。
SELECT IFNULL(FLOOR(COUNT(S0001)* 100 /
IFNULL((SELECT COUNT(*) FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(GETDATE(),INTERVAL -12 WEEK)),1)) ,1)
AS stat12wkMod1
FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(GETDATE(),INTERVAL -12 WEEK);
答案 0 :(得分:1)
使用Isnull for SQL-SERVER和IFNULL for MySQL
SELECT FLOOR(COUNT(S0001)* 100 /
IFNULL((SELECT COUNT(*) FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(CURDATE(),INTERVAL -12 WEEK)),1)
) AS stat12wkMod1
FROM stat_P01627
INNER JOIN lessons ON stat_P01627.lesson = lessons.id
INNER JOIN modules ON lessons.module = modules.id
WHERE lessons.module = 'MHG405294' AND lessons.classDate >= DATE_ADD(CURDATE(),INTERVAL -12 WEEK);
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/coalesce-transact-sql
ISNULL或IFNULL函数和COALESCE表达式具有类似的用途 但可以表现不同。
因为ISNULL是一个功能,它是 仅评估一次。
如上所述,输入值为 COALESCE表达式可以多次评估。数据类型 确定结果表达式是不同的。 ISNULL使用 第一个参数的数据类型COALESCE遵循CASE 表达式规则并返回具有最高值的数据类型 优先。
结果表达式的不可靠性是不同的 ISNULL和COALESCE。 ISNULL返回值始终被视为NOT NULLable(假设返回值是不可为空的),而 具有非空参数的COALESCE被视为NULL。所以 表达式ISNULL(NULL,1)和COALESCE(NULL,1)虽然等效 具有不同的可空性值。如果你这样做会有所不同 在计算列中使用这些表达式,创建关键约束 或者使标量UDF的返回值具有确定性 可以编入索引,如下例所示。