在SSMS中基于多值条件匹配映射表返回对应结果
使用SSMS实现基于Major/Minor Code多条件匹配的映射逻辑
问题背景
使用SSMS工具,需根据映射规则中Major Code和Minor Code的多值AND组合条件返回对应的Mapping Result,精确条件优先级高于模糊匹配。
1. 映射规则表
| Major Code | Minor Code | Mapping Result |
|---|---|---|
| 1-* | 01;02;04 | Cash |
| 1-199 | 02 | Petty Cash |
| 1-* | 05 | Accounts Receivables |
| 1-999 | 06 | Inventory |
| 1-5*;1-6* | 07;08 | Supplies |
| 1-* | * | !!!Missing |
匹配规则(优先级从高到低)
- 精确匹配:Major Code为
1-199且Minor Code为02→ 返回Petty Cash - 精确匹配:Major Code为
1-999且Minor Code为06→ 返回Inventory - 模糊匹配:Major Code匹配
1-5*或1-6*,且Minor Code为07或08→ 返回Supplies - 模糊匹配:Major Code匹配
1-*且Minor Code为01/02/04→ 返回Cash(已被高优先级的Petty Cash规则过滤特殊情况) - 模糊匹配:Major Code匹配
1-*且Minor Code为05→ 返回Accounts Receivables - 兜底规则:Major Code匹配
1-*但Minor Code不在上述范围内 → 返回!!!Missing
2. 主表示例与期望结果
| Major Code | Minor Code | Mapping Result |
|---|---|---|
| 1-001 | 04 | Cash |
| 1-199 | 02 | Petty Cash |
| 1-250 | 02 | Cash |
| 1-550 | 06 | !!!Missing |
| 1-699 | 08 | Supplies |
| 1-999 | 06 | Inventory |
| 1-999 | 10 | !!!Missing |
实现方案(T-SQL)
假设主表名为MainTable,包含MajorCode和MinorCode列,执行以下SQL语句即可得到符合要求的结果:
SELECT MajorCode, MinorCode, CASE -- 最高优先级:精确匹配1-199 + 02 WHEN MajorCode = '1-199' AND MinorCode = '02' THEN 'Petty Cash' -- 次高优先级:精确匹配1-999 + 06 WHEN MajorCode = '1-999' AND MinorCode = '06' THEN 'Inventory' -- 第三优先级:1-5*或1-6* + 07/08 WHEN (MajorCode LIKE '1-5%' OR MajorCode LIKE '1-6%') AND MinorCode IN ('07', '08') THEN 'Supplies' -- 第四优先级:1-* + 01/02/04(已被前面规则过滤特殊情况) WHEN MajorCode LIKE '1-%' AND MinorCode IN ('01', '02', '04') THEN 'Cash' -- 第五优先级:1-* + 05 WHEN MajorCode LIKE '1-%' AND MinorCode = '05' THEN 'Accounts Receivables' -- 兜底规则:1-* 但不在上述Minor Code范围内 WHEN MajorCode LIKE '1-%' THEN '!!!Missing' -- 非1-开头的情况(可根据实际需求调整) ELSE 'Unclassified' END AS MappingResult FROM MainTable;
关键说明
- 优先级控制:CASE语句从上到下执行,因此将优先级高的规则放在最前面,确保精确匹配优先生效。
- 通配符转换:SQL中用
%代替映射规则中的*作为模糊匹配通配符。 - 多值简化:用
IN运算符处理Minor Code的多值条件,比多个OR语句更简洁高效。
内容的提问来源于stack exchange,提问作者David.L
相关产品推荐
相关产品推荐

