簡體   English   中英

具有CASE語句的SQL LEFT JOIN

[英]SQL LEFT JOIN with a CASE Statement

我正在使用SQL Server 2005,並嘗試以一種似乎無法正常工作的方式來構建查詢。

我有兩張桌子。 一個表包含一個ItemTypes列表,另一個表包含一個ItemTypes與用戶之間的映射列表。

我想查詢將返回以下結果的查詢:

ID   | ItemType      | Enabled?
---------------------------------
1    | Type1         | false
2    | Type2         | true

Enabled列將基於另一個表中是否有條目。 我想使用某種case語句,如果存在LEFT JOIN項目,則輸入TRUE,否則輸入FALSE。

SELECT systype.ID, systype.TypeDescription, 
'Enable' = CASE hid.ID WHEN NULL THEN 'true' ELSE 'false' END
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
ON systype.ID = hid.SystemItemTypesID
AND hid.UserName = @UserName

但是,到目前為止我提出的這個查詢^並沒有達到我的預期。

關於如何調整此查詢以使其達到預期效果的任何建議?

編輯:當我做一個左聯接,只需選擇列“ hid.ID”,它將返回為NULL或實際ID。 我希望我可以根據是否為空來修改該值。

一種簡單有效的方法是使用EXISTS代替EXISTS

SELECT systype.ID, systype.TypeDescription, 
       [Enable] = CASE WHEN EXISTS( 
                     SELECT 1 FROM A7_HiddenNewsFeedTypes ft
                     WHERE ft.SystemItemTypesID = systype.ID
                     AND ft.UserName = @UserName
                  ) THEN 'true' ELSE 'false' END
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype

CASE有兩種格式。 檢查null值時,需要使用Searched Case NOT Simple Case

SELECT systype.ID, systype.TypeDescription, 
      CASE WHEN hid.UserName IS NULL THEN 'false' ELSE 'true' END Enabled
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
         ON systype.ID = hid.SystemItemTypesID
         AND hid.UserName = @UserName

您不能像其他值一樣比較null值。 在以下case使用is null運算符:

'Enable' = CASE WHEN hid.ID IS NULL THEN 'true' ELSE 'false' END
SELECT systype.ID, systype.TypeDescription, 
CASE WHEN hid.SystemItemTypesID IS NULL THEN 'true' ELSE 'false' END as Enable
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
ON systype.ID = hid.SystemItemTypesID
AND hid.UserName = @UserName
SELECT DISTINCT systype.ID, systype.TypeDescription, 
'Enable' = CASE
     WHEN hid.UserName = @UserName THEN 'true'
     ELSE 'false'
   END
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
ON systype.ID = hid.SystemItemTypesID
-- no join on UserName

這是不使用CASE另一種方法

'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM