SQL SP:如何返回一个非活动记录以及活动记录

时间:2016-09-27 13:23:19

标签: mysql sql sql-server stored-procedures having

我正在研究这个特殊的sql存储过程,其中的业务案例如下:

商业案例 Table Specialties包含所有Specialties,每个记录都有一个位字段,告诉它是活动还是非活动。我们始终只以下拉列表的形式显示该表中的活动记录。用户可以选择稍后可以停用的专业。新要求是能够将该非活动记录与结果集中的所有活动记录一起提取。

以下是我认为我应该这样做的方式: 如果没有为我提起的人分配专业,那么下拉列表将由所有活动记录填充。 如果存在与我正在提取的人关联的非活动专业,那么我将存储过程中的specialIDID作为参数发送,并返回非活动记录以及活动记录以填充下拉列表。

以下是我到目前为止的内容: 到目前为止,如果我没有通过任何专业,那么我将返回正在运作的活跃专业记录。当我发送一个specialtyId参数时,它只返回一个非活动记录,但不返回其他活动记录的其余部分。我还需要其余的活动记录以及那个非活动记录。

   DECLARE  @specialtyId  INT = null;
  BEGIN
    IF isnull(@specialtyId,'')=''
      BEGIN
        SELECT SpecialtyID AS Id, Specialty AS Name
          FROM dbo.Specialties
         WHERE IsActive = 1
         ORDER BY Specialty;
      END
    ELSE 
      BEGIN
        SET @specialtyId = @specialtyId ;

        SELECT s.SpecialtyID AS Id, s.Specialty AS Name
          FROM dbo.Specialties s
         WHERE specialtyId = @specialtyId
         GROUP BY s.Specialty, s.SpecialtyID
         HAVING (Specialty IS NOT NULL)
            AND (max(SpecialtyID) IS NOT NULL)
         ORDER BY Name;
      END
  END

2 个答案:

答案 0 :(得分:1)

在我看来,这可以在没有IF的情况下完成:

SELECT  s.SpecialtyID AS Id, 
        s.Specialty AS Name
FROM dbo.Specialties s
WHERE specialtyID = @specialtyId
OR IsActive = 1;

答案 1 :(得分:0)

您可以在where子句中执行此操作。在下面的例子中,它检查@specId是否传入并仅选择该ID或非活动记录,或者如果@specId为0,则只选择活动记录。

    IF OBJECT_ID('tempdb..#tmptest') IS NOT NULL
    DROP TABLE #tmptest
CREATE TABLE #tmptest
(
    SpecialtyID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    , SpecialtyName VARCHAR(50) NOT NULL
    , IsActive BIT NOT NULL DEFAULT (0)
)

INSERT INTO #tmptest
VALUES 
    ('Peditrician', 1)
    , ('Rad Tech', 1)
    , ('Surg Nurse', 1)
    , ('Peds Nurse', 1)
    , ('Cardio Doctor', 0)
    , ('Cardio Nurse', 1)
    , ('Test Doctor', 1)

DECLARE @SpecID INT = 0

SELECT *
FROM #tmptest
WHERE 
    ( 
        (@SpecID > 0 AND (SpecialtyID = @SpecID OR IsActive = 0))
        OR
        (@SpecID = 0 AND IsActive = 1)
    )