在SQL Server中对表行应用筛选器

时间:2018-10-11 04:49:17

标签: sql-server tsql

Mid     TemplateId  FilterName      MappingValue
-----   ----------  -------------   --------------
1       1            JobCode           DC123
2       1            ServiceType       Paid
3       1            SegmentType       New
4       2            JobCode           DC123
5       2            SegmentType       New
6       3            ServiceType       Paid

我正在编写一个存储过程以从上表中获取数据。

输入参数为:

JobCode, ServiceType, SegmentType

如果要为上述组合找到任何记录,我想从上表中获取唯一的templateId,如果没有,则应该为templateIdJobCode返回ServiceType,并且如果也未找到,则应寻找SegmentType

示例:

  • 如果JobCode = DC123ServiceType = PaidSegmentType = New,则代码应返回TemplateId = 1

  • 如果JobCode = DC123ServiceType = FreeSegmentType = New,则代码应返回TemplateId = 2

  • 如果JobCode = DC123ServiceType = PaidSegmentType = Old,则代码应返回TemplateId = 3

1 个答案:

答案 0 :(得分:0)

这是您可以使用的汇总查询:

CREATE PROCEDURE [dbo].[sp_yourproc]
    @jobCode varchar(100),
    @serviceType varchar(100),
    @segmentType varchar(100)
AS
BEGIN

    DECLARE @templateId int

    SET @templateId = (SELECT TemplateId FROM yourTable GROUP BY TemplateId
        HAVING
            (MAX(CASE WHEN FilterName = 'JobCode'     THEN MappingValue END) = @jobCode OR
             @jobCode IS NULL) AND
            (MAX(CASE WHEN FilterName = 'ServiceType' THEN MappingValue END) = @serviceType OR
             @serviceType IS NULL) AND
            (MAX(CASE WHEN FilterName = 'SegmentType' THEN MappingValue END) = @segmentType OR
             @segmentType IS NULL);

    -- do something with the @templateId

END

在存储的proc上下文中,您可能不想检查所有三个过滤器名称。在这种情况下,我将NULL输入参数视为有效,这意味着可以根据需要省略三个输入中的任何一个。