首頁 >資料庫 >mysql教程 >SQL Server JOIN條件中可以直接使用CASE語句嗎?

SQL Server JOIN條件中可以直接使用CASE語句嗎?

Patricia Arquette
Patricia Arquette原創
2025-01-20 07:36:08800瀏覽

Can CASE Statements Be Used Directly in JOIN Conditions in SQL Server?

SQL Server JOIN 條件與 CASE 語句:仔細觀察

使用 Microsoft SQL Server 2008 R2 的系統視圖(如 sys.partitionssys.allocation_units)時,它們之間的關係通常取決於 sys.allocation_units.type 值。 連接這些表的常見方法可能涉及 CASE 條件中的 JOIN 語句。

讓我們檢查一下這個場景:連接 sys.indexessys.partitionssys.allocation_units 需要基於 allocation_units.type 的條件連接。最初的嘗試可能如下所示:

<code class="language-sql">SELECT *
FROM sys.indexes i
JOIN sys.partitions p ON i.index_id = p.index_id
JOIN sys.allocation_units a ON CASE
    WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id
    WHEN a.type IN (2) THEN a.container_id = p.partition_id
END</code>

然而,這會導致語法錯誤。 這個問題源自於 SQL Server 中的 CASE 語句會產生標量值,而不是可執行語句。 他們無法直接控制 JOIN 子句中的相等比較。

解:使用 CASE 進行布林計算

要解決這個問題,我們需要重構 CASE 語句以傳回一個布林值(1 表示 true,0 表示 false),然後可以比較:

<code class="language-sql">SELECT *
FROM sys.indexes i
JOIN sys.partitions p ON i.index_id = p.index_id
JOIN sys.allocation_units a ON 
    CASE
        WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
        WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
        ELSE 0
    END = 1</code>

透過在 AND 子句中使用 WHEN 並將產生的 CASE 表達式與 1 進行比較,我們有效地創建了一個條件連接。 這表明,雖然 CASE 語句功能強大,但在 JOIN 條件下使用它們需要仔細考慮其返回類型以及顯式布林計算的需要。 不支援 CASE 內的 JOIN 語句本身內的直接賦值或相等檢定。

以上是SQL Server JOIN條件中可以直接使用CASE語句嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn