在SQL LEFT JOIN中使用ISNULL来检查结果是否为null,如果为null,则使用另一个值进行联接



我有一个带有where子句的SQL select,我想在其中检查结果是否为null,如果为null,我想使用where子句中的另一个值,但我得到了0行结果,即使我知道我应该得到一行作为结果。

这是我的(更新的(SQL代码:

DECLARE @LanguageCode NVARCHAR(3);
SET @LanguageCode = 'FR'
SELECT 
wi.WorkItemId,
ds.DisplayString AS Team
FROM dbo.WorkItem AS wi 
LEFT JOIN dbo.DisplayString AS ds ON ds.ElementID = wi.TierId AND ds.LocaleID = ISNULL(@LanguageCode, 'ENU')

上面的代码返回"0"的数据@LanguageCode;当有数据要返回时,但当没有数据时不会切换为使用"ENU"。这就是问题所在!

这也只是一个示例,因为这是一个更大的查询的一部分,其中有很多左联接;LocaleID";。我希望能有一些简单的解决方案,比如上面的代码。

为了明确我想要实现的目标,如果c.LocaleID = @LanguageCode返回空行,我希望使用c.LocaleID = ENU中的硬编码值。

如果我不使用ISNULL函数,只使用'ENU',它将返回预期的结果。

如果有任何帮助,我将不胜感激。谢谢

如果我理解正确,您需要一行,使用指定的语言代码或'ENU'。如果是,则使用过滤和ORDER BY:

SELECT TOP (1) c.*
FROM dbo.column1 c 
WHERE c.rowID = '1234-1234-1234' AND 
c.LocaleID IN (@LanguageCode, 'ENU')
ORDER BY (CASE WHEN c.LocaleID = @LanguageCode THEN 1 ELSE 2 END)

我想你正在寻找这个

select coalesce((SELECT rowID FROM dbo.column1 where c.rowID = '1234-1234-1234' and LocaleID = @LanguageCode),
(SELECT rowID FROM dbo.column1 where c.rowID = '1234-1234-1234' and LocaleID = 'ENU')); 

我相信你正在寻找这样的东西:

SELECT *
FROM table_name c
WHERE c.LocaleID  = 
case when (select count(*) 
from table_name tn
where tn.LocaleID = @LanguageCode) = 0 then
'ENU'
else
@LanguageCode
end;

这是演示。

下面是一个新的演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=624100ee44f89decc4c6383e92d0a016

在新的演示中,我添加了更多的代码来展示如何在左联接中使用它作为联接条件的一部分,我还添加了代码来展示在联接两个表时如何在where子句中使用它,我相信它属于where子句。。。

相关内容

最新更新