问题描述
我有一个带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;
这是一个新的演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=624100ee44f89decc4c6383e92d0a016
在新的演示中,我添加了更多代码以显示如何在左联接中使用它作为联接条件的一部分,并且还添加了代码以显示在联接两个表时在where子句中如何使用它。我相信它属于where子句...