SQL使用CASE语句左连接
我正在使用SQLServer2005,并试图以一种似乎无法正常工作的方式构建查询 我有两张桌子。一个表具有ItemType列表,另一个表具有ItemType和用户之间的映射列表 我想要一个将返回以下结果的查询:SQL使用CASE语句左连接,sql,sql-server-2005,Sql,Sql Server 2005,我正在使用SQLServer2005,并试图以一种似乎无法正常工作的方式构建查询 我有两张桌子。一个表具有ItemType列表,另一个表具有ItemType和用户之间的映射列表 我想要一个将返回以下结果的查询: ID | ItemType | Enabled? --------------------------------- 1 | Type1 | false 2 | Type2 | true 启用列将基于另一个表中是否有条目。我想使
ID | ItemType | Enabled?
---------------------------------
1 | Type1 | false
2 | Type2 | true
启用列将基于另一个表中是否有条目。我想使用某种case语句,如果左连接项存在,则将其置为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。我希望可以根据值是否为NULL来修改该值。有两种格式。检查null
值时,需要使用Searched Case
而不是Simple Case
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
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
值时,需要使用Searched Case
而不是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
值与其他值进行比较。在案例中使用is null
运算符:
'Enable' = CASE WHEN hid.ID IS NULL THEN 'true' ELSE 'false' END
不能将null
值与其他值进行比较。在案例中使用is null
运算符:
'Enable' = CASE WHEN hid.ID IS NULL THEN 'true' ELSE 'false' END
一种简单有效的方法是使用EXISTS
而不是join:
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
一种简单有效的方法是使用EXISTS
而不是join:
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
'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')
这只是另一种不使用CASE
'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')
如果有很多用户,将扫描许多行,因为用户名上的连接被删除(这就是为什么添加了distinct)。如果有很多用户,将扫描许多行,因为用户名上的连接被删除(这就是为什么添加了distinct)@Nenad实际上这是一个外部表,所以很可能存在为NULL的情况。(从技术上讲,这不是WHERE子句,而是连接标准。)@AaronBertrand。。我的错,我不知道怎么做,但我想我已经看到了WHERE
关键字。另外,请使用[方括号]
而不是“单引号”
作为列别名。后者在多种形式中被弃用,使您的别名看起来像字符串。或者更好的是,不要使用关键字,或者无论如何也不要费心去逃避它——这是没有必要的<代码>选择启用=1
工作正常,除了由于IntelliSense,Enable
在SSMS中显示为蓝色外。@Nenad实际上这是一个外部表,因此很可能存在它为空的情况。(从技术上讲,这不是WHERE子句,而是连接标准。)@AaronBertrand。。我的错,我不知道怎么做,但我想我已经看到了WHERE
关键字。另外,请使用[方括号]
而不是“单引号”
作为列别名。后者在多种形式中被弃用,使您的别名看起来像字符串。或者更好的是,不要使用关键字,或者无论如何也不要费心去逃避它——这是没有必要的<代码>选择启用=1
工作正常,除了由于IntelliSense,启用
在SSMS中以蓝色显示。我想,这永远不会返回false,因为hid.UserName=@UserName的位置为什么要将hid.UserName加入条件更改为筛选器?您刚刚将其从左连接更改为内部连接。啊,很抱歉,这是一个错误,我正在关注大小写,谢谢您指出。我想,这永远不会返回false,因为hid.UserName=@UserName为什么要将hid.UserName连接条件更改为筛选器?您刚刚将此从左连接更改为内部连接。啊,抱歉,这是一个错误,我正在集中精力处理案例,谢谢您指出。这正是我要找的。我刚才对案件陈述的措辞不恰当。工作得很好。谢谢,正是我想要的。我刚才对案件陈述的措辞不恰当。工作得很好。谢谢。还需要一些外部查询,还是不需要?@vasja为什么?A7_SystemItemTypes表的原始查询中没有过滤器。好的,我现在看到(由于没有提供示例,我对表中的内容的错误猜测)仍然需要一些外部查询的WHERE,或者没有?@vasja为什么?A7_SystemItemTypes表的原始查询中没有过滤器。好的,我现在明白了(由于没有提供示例,我对表中的内容的猜测是错误的)