Postgresql

如果匹配中不存在列,如何將其顯示為 NULL?

  • April 19, 2018

我有一個查詢,如下所示。

在此查詢中,我試圖獲取沒有消息的訂單的結果(我認為它為空)。message_id但我期待如果有人有訂單但沒有消息,這個查詢會產生一個 NULL 。我該怎麼做才能達到我的目標?

select *, a.message_id as x
from
 messages a
 FULL OUTER JOIN customers b ON a.customer_id = b.customer_id
 FULL OUTER JOIN orders c ON c.customer_id = b.customer_id
 FULL OUTER JOIN delivery_templates d ON c.billing_template_id = d.delivery_template_id
 FULL OUTER JOIN products e ON a.product_id = e.product_id
 FULL OUTER JOIN order_items f ON f.order_id = c.order_id    
where
 a.seller_id in (2, 3, 1, 6)
 AND
 a.message_id ISNULL

我正在嘗試獲取沒有消息的訂單的結果。

換句話說:“不存在與 had 的訂單相關聯的消息”。改寫應該有助於理解EXISTS反半連接中語法的翻譯:

SELECT *  -- or just the columns you need
FROM   orders o
WHERE  NOT EXISTS (
  SELECT FROM messages
  WHERE  customer_id = o.customer_id
  );

與您的問題標題相反,不需要顯示任何額外的空值,因為這些是根據要求的沒有消息的訂單

獲取沒有特定類型消息的訂單(seller_id in (2, 3, 1, 6)

SELECT *
FROM   orders o
WHERE  NOT EXISTS (
  SELECT FROM messages
  WHERE  customer_id = o.customer_id
  AND    seller_id in (2, 3, 1, 6)    -- add that condition here
  );

您加入的所有其他表似乎與問題無關,但可能會產生額外的行。

為什麼?

message_id但我期待如果有人有訂單但沒有消息,這個查詢會產生一個 NULL 。我該怎麼做才能達到我的目標?

答案幾乎隱藏在您的陳述中:…此查詢將在message_id.

您從 an的缺失行列中獲得的 NULL 值是在事後OUTER JOIN填充的(由查詢本身產生,而不是從表中讀取)。手冊:

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

對於兩種不同的情況,該WHERE條件a.message_id ISNULL為真:

  1. 表中沒有符合條件的行a
  2. 有一個符合條件的行a,其列message_id包含一個 NULL 值。

在子句中的第一個謂詞a.seller_id in (2, 3, 1, 6)使用 in 中的現有WHERE強制執行結果之後,只有在列中具有實際 NULL 值的行才會通過 - 如果已定義,這是不可能的,並且與您聲明的不存在此類行的要求相矛盾。messages``message_id``message_id``NOT NULL

您可以將條件a.seller_id in (2, 3, 1, 6)WHERE子句移到OUTER JOIN. 但更好地使用NOT EXISTS如展示。有關的:

您正在談論查詢返回時如何顯示投影。 null請記住,null是代表某事的類型。它沒有固定的顯示/渲染。對於那個用途coalesce

SELECT coalesce(a.message_id, 'NULL') -- or whatever you want the result is `null`

代替

SELECT a.message_id

null 有關更多資訊,請參閱文件COALESCE

COALESCE函式返回它的第一個不是 的參數nullNull僅當所有參數都是 時才返回null當檢索數據以進行顯示時,它通常用於將預設值替換為空值。

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