SQL SP:如何 return 一个非活动记录和一个活动记录
SQL SP: How to return one inactive record along with active records
我正在研究这个特殊的 sql 存储过程,其中的业务案例如下:
商业案例:
Table Specialties 包含所有 Specialties,并且每个记录都有一个位域,表明它是活跃的还是不活跃的。我们总是以下拉列表的形式仅显示 table 中的活动记录。用户可以 select 一种稍后可以停用的专业。新要求是能够将非活动记录与结果集中的所有活动记录一起提取。
我认为我应该这样做:
如果没有为我拉起的人分配专业,那么下拉列表将由所有活动记录填充。
如果有与我拉起的人相关的非活动专业,那么我将该专业 ID 作为参数发送到存储过程中,并且 return 将非活动记录与活动记录一起填充下拉列表。
以下是我目前得到的:
到目前为止,如果我没有传递任何 specialtyId,那么我正在 returning 有效的专业记录。当我发送一个 specialtyId 参数时,它只是 return 一个非活动记录,而不是其他活动记录的其余部分。我还需要其余的活动记录以及那条非活动记录。
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
在我看来,这可以在没有任何 IF
的情况下完成:
SELECT s.SpecialtyID AS Id,
s.Specialty AS Name
FROM dbo.Specialties s
WHERE specialtyID = @specialtyId
OR IsActive = 1;
您可以在 where 子句中完成所有操作。在下面的例子中,它检查是否传入了@specId 并且 select 仅是该 ID 或非活动记录,或者如果 @specId 为 0,则仅 select 活动记录。
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)
)
我正在研究这个特殊的 sql 存储过程,其中的业务案例如下:
商业案例: Table Specialties 包含所有 Specialties,并且每个记录都有一个位域,表明它是活跃的还是不活跃的。我们总是以下拉列表的形式仅显示 table 中的活动记录。用户可以 select 一种稍后可以停用的专业。新要求是能够将非活动记录与结果集中的所有活动记录一起提取。
我认为我应该这样做: 如果没有为我拉起的人分配专业,那么下拉列表将由所有活动记录填充。 如果有与我拉起的人相关的非活动专业,那么我将该专业 ID 作为参数发送到存储过程中,并且 return 将非活动记录与活动记录一起填充下拉列表。
以下是我目前得到的: 到目前为止,如果我没有传递任何 specialtyId,那么我正在 returning 有效的专业记录。当我发送一个 specialtyId 参数时,它只是 return 一个非活动记录,而不是其他活动记录的其余部分。我还需要其余的活动记录以及那条非活动记录。
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
在我看来,这可以在没有任何 IF
的情况下完成:
SELECT s.SpecialtyID AS Id,
s.Specialty AS Name
FROM dbo.Specialties s
WHERE specialtyID = @specialtyId
OR IsActive = 1;
您可以在 where 子句中完成所有操作。在下面的例子中,它检查是否传入了@specId 并且 select 仅是该 ID 或非活动记录,或者如果 @specId 为 0,则仅 select 活动记录。
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)
)