嵌套查询中的COALESCE

时间:2017-04-18 21:02:07

标签: sql coalesce

当结果(在本例中为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);

1 个答案:

答案 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的返回值具有确定性   可以编入索引,如下例所示。