sql-server - 对 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
从上表中获取唯一的,如果没有,它应该返回templateId
and JobCode
,ServiceType
如果也没有找到它应该寻找SegmentType
。
例子:
如果
JobCode = DC123
,ServiceType = Paid
和SegmentType = New
, 那么代码应该返回TemplateId = 1
如果
JobCode = DC123
,ServiceType = Free
并且SegmentType = New
, 代码应该返回TemplateId = 2
如果
JobCode = DC123
,ServiceType = Paid
并且SegmentType = Old
, 代码应该返回TemplateId = 3
解决方案
这是您可以使用的聚合查询:
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
输入参数视为有效,这意味着如果需要,可以省略三个输入中的任何一个。
推荐阅读
- python - Tensorflow 错误:无法找到可以处理输入的数据适配器:
, 和内存错误 - docker - 如何在 Docker alpine 容器上安装 hwloc-dev 包
- java - LocalDate JPA 存储库奇怪的“功能”
- linux - 如何合并三个文件的内容(作为输入)并使用 shell 脚本显示
- mysql - mysql:连接两个表,然后拆分结果表的一列
- react-native - 如何在本机反应中检查互联网连接?
- bioinformatics - 如何从我的蛋白质列表中排除具有 FASTA 格式的长蛋白质序列
- reactjs - React Material UI 自动完成功能不适用于 formik
- reactjs - 在反应路由器 v5 中处理不正确的 url
- java - 使用 PBKDF2 和 AES256 进行加密和解密 - 需要实际示例 - 如何获取派生密钥