如何解决用于检查查询是否返回任何记录的 case 语句
我的存储过程以 [PhaseId] 作为参数,我需要根据作为参数传递的 PhaseId 从表中返回结果集。
如果表中没有匹配该条件的数据,那么我想返回另一个 PhaseId 的结果集,我们称之为 DefaultPhaseId
DECLARE @DefaultPhaseId INT
SELECT @DefaultPhaseId = [PhaseId] FROM dbo.[Phase] WHERE [Description] = 'Unanimous'
SELECT * FROM [PhaseSelection] WHERE PhaseId = @PhaseId AND [IsActive] = 1
这里我需要检查上面的查询是否有任何返回的记录,如果没有我需要执行下面的查询
SELECT * FROM [PhaseSelection] WHERE PhaseId = @DefaultPhaseId AND [IsActive] = 1
解决方法
您根本不需要任何程序代码。如果其他 ID 的结果为空,您可以使用 UNION ALL
添加默认 ID 的结果。
SELECT *
FROM [PhaseSelection]
WHERE [PhaseId] = @PhaseId
AND [IsActive] = 1
UNION ALL
SELECT *
FROM [PhaseSelection]
WHERE [PhaseId] = @DefaultPhaseId
AND [IsActive] = 1
AND NOT EXISTS (SELECT *
FROM [PhaseSelection]
WHERE [PhaseId] = @PhaseId
AND [IsActive] = 1);
,
您可以使用 TOP (1) WITH TIES
玩一些技巧,这只会为您提供第一组可用的行。
SELECT TOP (1) WITH TIES
*
FROM (
SELECT ps.*,0 AS Ordering
FROM [PhaseSelection] ps
WHERE PhaseId = @PhaseId AND [IsActive] = 1
UNION ALL
SELECT ps.*,1 AS Ordering
FROM [PhaseSelection] ps
JOIN dbo.[Phase] p ON ps.[PhaseId] = p.[PhaseId]
WHERE p.[IsActive] = 1 AND p.[Description] = 'Unanimous'
) ps
ORDER BY Ordering;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。