3
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

这可能在单个查询中吗?

谢谢和问候,费萨尔·纳西尔

4

2 回答 2

0

您的结果描述与实际结果不符。如果您需要数据中 regionid 和 districtid 的保育日,则该值应为空。

您将需要创建一个如图所示的存储过程来获得结果。

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

如果您需要使用临时表,则需要在存储过程中创建它以使其仍然可用。在示例中,我使用了永久表。

结束

于 2013-02-03T20:27:44.290 回答
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
;
于 2013-02-03T21:46:11.520 回答