CREATE TABLE #tmpTableA
(
[Id] [int] NOT NULL,
RegionId INT,
DistrictId INT,
NurseryDays INT,
TransplantDays INT
)
INSERT #tmpTableA ([Id], RegionId,DistrictId,NurseryDays,TransplantDays) VALUES (1,1,NULL,2,2)
INSERT #tmpTableA ([Id], RegionId,DistrictId,NurseryDays,TransplantDays) VALUES (2,1,2,NULL,2)
示例代码的输出是,
Id RegionId DistrictId NurseryDays TransplantDays
2 1 2 NULL 2
1 1 NULL 2 2
我想要的结果是, 1.)如果RegionId和DistrictId存在,则获得此组合的移植天数,否则获得RegionId和DistrictId的移植天数(NULL)。
2。)如果RegionId和DistrictId存在,那么获得这个组合的托儿所天数,否则获得RegionId和DistrictId(NULL)的托儿所天数。
NurseryDays TransplantDays
2 2
这可以在单个查询中使用吗?
谢谢&问候, 费萨尔纳西尔
答案 0 :(得分:0)
结果说明与实际结果不符。如果您需要regionid的托儿所天数并从您的数据中删除,则该值应为空。
您需要创建一个存储过程,如图所示,以获得结果。
create PROCEDURE ProcGetDays
@regionid int
AS
BEGIN
SET NOCOUNT ON;
declare @nurserydays int
declare @transplantdays int
select @transplantdays = transplantdays from tmpTableA where regionid=@regionid and districtid is not null
if @transplantdays is null
select @transplantdays = transplantdays from tmpTableA where regionid=@regionid
select @nurserydays=nurserydays from tmpTableA where regionid=@regionid and districtid is not null
if @nurserydays is null
select @nurserydays=nurserydays from tmpTableA where regionid=@regionid
select @nurserydays as nurserydays,@transplantdays as transplantdays
END
GO
如果您需要使用临时表,则需要在存储过程中创建它以使其仍然可用。在样本中我使用了永久表。
END GO
答案 1 :(得分:0)
首先,使用过滤器检索具有特定RegionId
和特定或NULL DistrictId
的行。然后对行进行排序,使更具体的行在另一行之前,并选择最顶行。
在SQL中,它可能如下所示:
SELECT TOP 1
NurseryDays,
TransplantDays
FROM YourTable
WHERE RegionId = @RegionId
AND (DistrictId = @DistrictId OR @DistrictId IS NULL)
ORDER BY
CASE DistrictId
WHEN @DistrictId THEN 0
ELSE 1
END
;