SQL Server JOIN 條件與 CASE 語句:仔細觀察
使用 Microsoft SQL Server 2008 R2 的系統視圖(如 sys.partitions
和 sys.allocation_units
)時,它們之間的關係通常取決於 sys.allocation_units.type
值。 連接這些表的常見方法可能涉及 CASE
條件中的 JOIN
語句。
讓我們檢查一下這個場景:連接 sys.indexes
、sys.partitions
和 sys.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中文網其他相關文章!