Postgresql

為什麼 COALESCE 函式不適用於此查詢?

  • March 12, 2017

我正在嘗試計算從子查詢中檢索到的列數,並且某些子查詢可能為空。因此,我不想將其顯示為空單元格,而是希望它為 0。發現我可以通過使用該COALESCE函式來做到這一點,但是例如這個查詢仍然給了我一個空單元格:

CREATE VIEW third_table AS 
SELECT * 
FROM  (second_table  
NATURAL FULL JOIN (
  SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79 
  FROM (
     SELECT assignment_id, mark_as_percent 
     FROM avg_required_table
     WHERE mark_as_percent >= 60 
     AND mark_as_percent < 80
     ) a 
  GROUP BY assignment_id
  ) b);

COALESCE是應該如何使用的嗎?

回答你的問題

COALESCE你把它放在哪裡開始是***完全沒有意義的。***聚合函式count() 從不返回 NULL。並且邏輯規定num_60_79在子查詢中永遠不能低於 1。有關的:

但這無關緊要,因為如果子查詢不返回任何行,則它根本無法返回任何值。

準確地說,在您的情況下,子查詢可能會返回任意數量的行,但是,當加入 時second_table,如果沒有匹配值的行,(assignment_id, num_60_79)則子查詢中的所有列b都將填充 NULL 值。有關的:

NATURAL FULL JOIN是一種非常奇特的連接表格的方式。特別是對於仍在學習如何使用的人COALESCE引用手冊:

NATURAL``USING是提及兩個表中具有相同名稱的所有列的列表的簡寫。

和:

FULL OUTER JOIN返回所有連接的行,加上每個不匹配的左側行(右側以空值擴展)的一行,以及每個不匹配的右側行(左側以空值擴展)的一行。

我認為可以安全地假設其中沒有列命名num_60_79second_table並且如果有的話,您肯定不想將其包含在連接條件中。您只想加入 column assignment_id,這就是您應該在查詢中而不是NATURAL關鍵字中輸入的內容。

此外,雖然在這裡FULL JOIN理論上是可能的,但我們通常會看到一個LEFT JOIN.

您也不需要兩層子查詢和查詢中的一些其他噪音。

正確查詢

考慮到所有的事情,當你…

試圖計算從子查詢中檢索到的列數

…我有根據的猜測是你想要這個查詢:

SELECT s.*, COALESCE(b.num_60_79, 0) AS num_60_79
FROM   second_table s
LEFT   JOIN (
  SELECT assignment_id, count(*) AS num_60_79 
  FROM   avg_required_table
  WHERE  mark_as_percent >= 60 
  AND    mark_as_percent <  80
  GROUP  BY assignment_id
  ) b USING (assignment_id);

引用自:https://dba.stackexchange.com/questions/166971