2017-04-18 52 views
1

當結果(本例中爲lessons.classDate)不存在時,試圖阻止此查詢返回NULL。我確信COALESCE應該被包裹起來,但是我不能正確地理解語法。嵌套查詢中的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

哪個數據庫引擎? – maSTAShuFu

+1

這就是爲什麼你使用isnull(field,1) – maSTAShuFu

+0

你正在使用哪些DBMS? –

回答

1

使用ISNULL對於SQL-SERVER和IFNULL爲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返回值總是被認爲是不可空的(假設返回值是不可空的),而具有非空參數的COALESCE被認爲是NULL。因此 表達式ISNULL(NULL,1)和COALESCE(NULL,1)儘管等效的 具有不同的可空性值。如果您在計算列中使用這些表達式,創建關鍵約束 或使標量UDF的返回值具有確定性,以便它可以按照以下示例中所示進行索引編制,則這是有所不同的。

+1

你的意思是你不能得到0?內部連接需要表格之間的顯式關係,因此當關系丟失時它將返回0 – maSTAShuFu

+0

嗯,錯誤的參數錯誤?我已經改變它爲ISNULL((SELECT ...),1) – DarkMalice

+1

你可以請嘗試更新的腳本.. isnull((select),1)--->子查詢需要一個括號內功能 – maSTAShuFu