【问题标题】:Case statement to check if any record is returned by the query用于检查查询是否返回任何记录的 case 语句
【发布时间】:2021-06-18 11:37:18
【问题描述】:

我的存储过程以 [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

【问题讨论】:

  • CASE 语句在这里对您没有帮助,T-SQL 不支持它们。但是,您可以使用IF 语句并检查@@ROWCOUNT 的值是否大于0
  • 尝试了 CASE 语句,但它不起作用,我觉得可能是我没有以正确的方式做它所以在这里发布...如果语句和 @@ROWCOUNT 我需要使用查询在 If 语句中?
  • PhaseId 是表的主键(或唯一键)吗?
  • “尝试过 CASE 语句,但不起作用” 不,它不会,因为我提到 T-SQL 不支持 Case 语句,仅支持 @987654329 @ 表达式。不,@@ROWCOUNT 返回上一条语句影响的行数。
  • 是 [PhaseId] 是 [Phase] 表的 PK

标签: sql sql-server tsql case


【解决方案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);

【讨论】:

    【解决方案2】:

    您可以使用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多