[英]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.