【问题标题】:COALESCE in Nested Query嵌套查询中的 COALESCE
【发布时间】:2017-04-18 21:02:06
【问题描述】:

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

【问题讨论】:

  • 哪个数据库引擎?
  • 这就是你使用 isnull(field,1) 的原因
  • 您使用的是哪个 DBMS?

标签: sql coalesce


【解决方案1】:

对 SQL-SERVER 使用 Isnull,对 MySQL 使用 IFNULL

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 OR IFNULL 函数和 COALESCE 表达式具有相似的目的 但可以表现不同。

因为 ISNULL 是一个函数,所以它是 只评估一次。

如上所述,输入值为 COALESCE 表达式可以计算多次。数据类型 结果表达式的确定是不同的。 ISNULL 使用 第一个参数的数据类型,COALESCE跟在CASE后面 表达式规则并返回最高值的数据类型 优先级。

结果表达式的 NULLability 是不同的 ISNULL 和 COALESCE。 ISNULL 返回值始终被视为 NOT 可空的(假设返回值是不可空的)而 具有非空参数的 COALESCE 被认为是 NULL。所以 表达式 ISNULL(NULL, 1) 和 COALESCE(NULL, 1) 虽然等效 具有不同的可空性值。如果您是,这会有所不同 在计算列中使用这些表达式,创建键约束 或使标量 UDF 的返回值具有确定性,以便它 可以按照以下示例进行索引。

【讨论】:

  • 你的意思是你不能得到0?内连接需要表之间的显式关系,因此在缺少关系时它将返回 0
  • 嗯,不正确的参数错误?我已将其更改为 ISNULL((SELECT...),1)
  • 你能试试更新的脚本吗..isnull( (select) , 1) ---> 子查询需要在函数内加括号
  • 应该是---------> INTERVAL -12 WEEK)),1) ) AS stat12wkMod1
  • 我认为错误在于 curdate() 您在使用哪种数据库? sql-server 是 getdate()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2018-03-23
  • 2021-07-16
  • 2019-08-02
  • 2011-02-23
  • 2021-07-18
相关资源
最近更新 更多