你可以尝试波纹管的解决方案:
DECLARE @Company2Type TABLE (
ID INT NOT NULL
UNIQUE NONCLUSTERED,
Company VARCHAR(50) NOT NULL,
[Type] VARCHAR(50) NOT NULL,
PRIMARY KEY CLUSTERED (Company, [Type])
)
INSERT @Company2Type
VALUES
(1, '*', '*'),
(2, 'CMP1', '*'),
(3, 'CMP1', 'TYP1'),
(4, '*', 'TYP1'),
(5, '*', 'TYP2'),
(6, 'CMP1', 'TYP2');
DECLARE @TestData TABLE (
Company VARCHAR(50) NOT NULL,
[Type] VARCHAR(50) NOT NULL
)
INSERT @TestData
VALUES
('CMP1' , 'TYP1'),
('CMP2' , 'TYP2'),
('CMP5' , 'TYP5');
SELECT *, COALESCE(rule1.ID, rule2.ID, rule3.ID, rule4.ID) AS [Output]
FROM @TestData td
OUTER APPLY (
SELECT ct.ID
FROM @Company2Type ct
WHERE ct.Company = td.Company
AND ct.[Type] = td.[Type]
) rule1
OUTER APPLY (
SELECT ct.ID
FROM @Company2Type ct
WHERE rule1.ID IS NULL
AND ct.Company = td.Company
AND ct.[Type] = '*'
) rule2
OUTER APPLY (
SELECT ct.ID
FROM @Company2Type ct
WHERE rule1.ID IS NULL
AND ct.Company = '*'
AND ct.[Type] = td.[Type]
) rule3
OUTER APPLY (
SELECT ct.ID
FROM @Company2Type ct
WHERE rule1.ID IS NULL
AND ct.Company = '*'
AND ct.[Type] = '*'
) rule4
结果:
Company Type ID ID ID ID Output
------- ---- ---- ---- ---- ---- ------
CMP1 TYP1 3 NULL NULL NULL 3
CMP2 TYP2 NULL NULL 5 1 5
CMP5 TYP5 NULL NULL NULL 1 1
注:
- [规则1]这两家公司和类型匹配
- [规则2]公司匹配和测试类型相匹配*
- [规则3]测试公司*一致和类型匹配
- [Rule4]这两家公司和类型匹配*
您的示例中似乎缺少一个案例。如果在公司和通配符类型上有完全匹配,并且在公司类型和通配符匹配上有完全匹配,则会发生什么情况?哪一个会被视为“最佳匹配”? –
是的,谢谢你的评论,在我的情况下,我更喜欢公司之一 –