选择特定键上的记录,如果不存在,则回退为空值

时间:2018-04-22 15:33:57

标签: sql sql-server group-by

我的产品有价格,有时公司的产品价格更具特色。

我想知道我是否可以对此进行一个很好的查询?

很简单的例子:

表ProductPrice:

Id | ProductId | Price | CompanyId
===|===========|=======|===========
1  | 10        | 100   | NULL
2  | 20        | 300   | NULL
3  | 25        | 500   | NULL
4  | 25        | 400   | 977

现在我想选择始终使用companyId作为参数,但结果应返回最具体的记录。

所以我想在我的ProductPrice表中查询companyId = 977,因此我想要:

1  | 10        | 100   | NULL
2  | 20        | 300   | NULL
4  | 25        | 400   | 977

任何可以告诉我这个小组如何运作的人?

谢谢!

1 个答案:

答案 0 :(得分:1)

嗯。您想要的是优先级查询。这是一种方式:

select pp.*
from productprice pp
where pp.company = 977
union all
select pp.*
from productprice pp
where pp.company is null and
      not exists (select 1 from productprice where pp2.productid = pp.productid and pp2.company = 977);

这适用于(两个)优先级。更通用的方法是使用row_number()

select pp.*
from (select pp.*,
             row_number() over (partition by productid
                                order by case company 977 then 1 else 2 end
                               ) as seqnum
     from productprice pp
    ) pp
where seqnum = 1;

第三种选择假设您有products表(合理)。在这种情况下:

select pp.*
from product p cross apply
     (select top 1 pp.*
      from productprice pp
      where pp.productid = p.productid
      order by (case companyid when 977 then 1 else 2 end)
     ) pp;