在SQL LEFT JOIN中使用ISNULL来检查结果是否为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')

上面的代码在有要返回的数据时返回“ @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)
,

我认为您正在寻找这个

Publish has encountered an error. Publishing Failed.
A diagnostic log has been written to the following location : .tmp path is given
,

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

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;

Here is the demo.

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...