如果匹配中不存在列,如何將其顯示為 NULL?
我有一個查詢,如下所示。
在此查詢中,我試圖獲取沒有消息的訂單的結果(我認為它為空)。
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
為真:
- 表中沒有符合條件的行
a
- 有一個符合條件的行
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
函式返回它的第一個不是 的參數null
。Null
僅當所有參數都是 時才返回null
。當檢索數據以進行顯示時,它通常用於將預設值替換為空值。