首页 > 解决方案 > 对 SQL Server 中的表行应用过滤器

问题描述

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从上表中获取唯一的,如果没有,它应该返回templateIdand JobCodeServiceType如果也没有找到它应该寻找SegmentType

例子:

标签: sql-servertsql

解决方案


这是您可以使用的聚合查询:

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

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


推荐阅读