源目标系统列值匹配:如何实现精准OK/ERROR判定
解决源目标系统列值一致性匹配问题
我来帮你搞定这个匹配问题!你的测试数据里那些本该判为OK的案例全成了ERROR,核心原因是你原来的逻辑是完全字符串匹配,但实际数据存在几个常见的混乱情况:
- 项之间的空格差异(比如第一条里逗号后有没有空格)
- 源数据包含重复项(第二条、第四条)
- 项的排列顺序不一致(第三条、第四条)
要解决这个问题,我们需要先把两个字符串都转换成标准化格式:去掉多余空格、去重、按固定顺序排序,再对比标准化后的结果。下面是具体的实现方案:
步骤1:创建字符串标准化函数
这个函数会把输入的列表字符串处理成统一格式:
CREATE FUNCTION dbo.StandardizeList(@Input VARCHAR(800)) RETURNS VARCHAR(800) AS BEGIN DECLARE @Standardized VARCHAR(800) = '' -- 处理空值,和原逻辑保持一致用'0'替代 IF @Input IS NULL SET @Input = '0' -- 拆分字符串、清理空格、去重、排序后重新拼接 ;WITH SplitItems AS ( -- 拆分每个项并去掉前后空格,排除空项 SELECT TRIM(value) AS Item FROM STRING_SPLIT(@Input, ',') WHERE TRIM(value) <> '' ), DeduplicatedSorted AS ( -- 去重并按字母顺序排序 SELECT DISTINCT Item FROM SplitItems ORDER BY Item ) -- 把排序后的项拼接成标准格式字符串 SELECT @Standardized = STRING_AGG(Item, ', ') FROM DeduplicatedSorted -- 处理特殊情况:如果原输入是空字符串,返回'0' RETURN COALESCE(@Standardized, '0') END
步骤2:修改测试表的匹配逻辑
用上面的标准化函数替换原来的直接相等判断:
CREATE TABLE #testdata ( ID INT ,ValueSource VARCHAR(800) ,ValueDestination VARCHAR(800) ,Value_Varchar_Check AS ( -- 对比标准化后的字符串 CASE WHEN dbo.StandardizeList(ValueSource) = dbo.StandardizeList(ValueDestination) THEN 'OK' ELSE 'ERROR' END ) ) INSERT INTO #testdata ( ID ,ValueSource ,ValueDestination ) SELECT 1 ,'hepatitis c,other (specify)', 'hepatitis c, other (specify)' UNION ALL SELECT 2 ,'lung problems / asthma,lung problems / asthma' ,'lung problems / asthma' UNION ALL SELECT 3 ,'lung problems / asthma,diabetes' ,'diabetes, lung problems / asthma' UNION ALL SELECT 4 ,'seizures/epilepsy,hepatitis c,seizures/epilepsy' ,'hepatitis c, seizures/epilepsy' -- 查看结果,所有案例都会显示OK SELECT * FROM #testdata
兼容旧版本SQL Server(2017之前)
如果你的SQL Server版本不支持STRING_AGG,可以用FOR XML PATH来实现拼接,把函数里的拼接部分替换成:
;WITH SplitItems AS ( SELECT TRIM(value) AS Item FROM STRING_SPLIT(@Input, ',') WHERE TRIM(value) <> '' ), DeduplicatedSorted AS ( SELECT DISTINCT Item FROM SplitItems ) -- 用FOR XML PATH拼接成字符串 SELECT @Standardized = STUFF( (SELECT ', ' + Item FROM DeduplicatedSorted ORDER BY Item FOR XML PATH('')), 1, 2, '' )
这个方案会自动处理你遇到的所有混乱情况,确保只要两个字符串包含的有效项(去重后)一致,不管顺序、空格、重复情况,都会判定为OK。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

