You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定键查询记录(无则返回NULL):产品价格优先级查询

解决专属定价优先匹配的SQL查询方案

这是个非常典型的「优先级匹配」查询场景,我直接给你两种实用的实现方式,根据你的使用场景选就行:

方式一:批量获取所有产品的最优定价(推荐用于多产品场景)

用窗口函数ROW_NUMBER()给每个产品的定价记录排序,优先保留目标公司的专属定价,没有的话就用通用定价:

-- 定义目标公司ID参数,替换成你实际的参数值或变量
DECLARE @TargetCompanyId INT = 977;

WITH RankedPrices AS (
    SELECT 
        Id,
        ProductId,
        Price,
        CompanyId,
        -- 排序规则:匹配目标CompanyId的记录排第一,通用定价排第二
        ROW_NUMBER() OVER (
            PARTITION BY ProductId 
            ORDER BY CASE WHEN CompanyId = @TargetCompanyId THEN 0 ELSE 1 END
        ) AS PriceRank
    FROM ProductPrice
    -- 只筛选目标公司的专属定价和通用定价
    WHERE CompanyId = @TargetCompanyId OR CompanyId IS NULL
)
-- 取每个产品的第一优先级记录
SELECT Id, ProductId, Price, CompanyId
FROM RankedPrices
WHERE PriceRank = 1;

逻辑说明:

  1. 用CTERankedPrices给每个ProductId分组,然后根据是否匹配目标CompanyId排序:匹配的记录会被标记为PriceRank=1,通用定价(CompanyId IS NULL)标记为PriceRank=2
  2. 最后筛选PriceRank=1的记录,就是每个产品的最优定价

示例验证:

当@TargetCompanyId=977时,返回结果如下:

IdProductIdPriceCompanyId
110100NULL
220300NULL
425400977

完全符合需求:ProductId=25取专属定价,其他产品取通用定价。

方式二:单产品的最优定价查询(适合单个产品场景)

如果只需要查询某一个产品的最优定价,可以用更简洁的TOP 1+排序的方式:

DECLARE @TargetCompanyId INT = 977;
DECLARE @TargetProductId INT = 25;

SELECT TOP 1 Id, ProductId, Price, CompanyId
FROM ProductPrice
WHERE ProductId = @TargetProductId 
  AND (CompanyId = @TargetCompanyId OR CompanyId IS NULL)
-- 优先返回目标公司的专属定价
ORDER BY CASE WHEN CompanyId = @TargetCompanyId THEN 0 ELSE 1 END;

这个语句会直接返回匹配目标产品的优先级最高的定价记录,逻辑和方式一一致,只是更轻量化。


内容的提问来源于stack exchange,提问作者deblendewim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:51:40