You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

源目标系统列值匹配:如何实现精准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:28:11