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

SQL Server 2022:如何匹配拼接值到临时表并填充GuaranteeItem列

修正SQL Server中物料号匹配逻辑实现GuaranteeItem赋值需求

原SQL的核心问题

  1. 通配符使用错误:CONCAT(prd.MARA.MATNR, '%C') 将%作为普通字符拼接,而IN是精确匹配,无法匹配临时表中类似1010080PC的真实值——%只有在LIKE语句中才是通配符。
  2. 关联条件无效:LEFT JOIN的条件是prd.TempTable.MATNR = prd.MARA.MATNR,但临时表存储的都是以C结尾的物料号,非C结尾的物料号根本无法关联到目标记录,导致CASE语句无法获取对应带C的物料号。

修正后的SQL方案

以下两种写法均可实现需求,根据实际数据量选择:

方案1:使用LEFT JOIN关联匹配

SELECT 
    m.MATNR,
    CASE
        -- 本身以C结尾,GuaranteeItem留空
        WHEN m.MATNR LIKE '%C' THEN ''
        -- 关联到对应C结尾物料号则赋值,否则留空
        ELSE ISNULL(t.MATNR, '')
    END AS GuaranteeItem
FROM prd.MARA m
LEFT JOIN prd.TempTable t 
    -- 匹配以当前物料号开头,且最后一位是C的记录
    ON t.MATNR LIKE CONCAT(m.MATNR, '%') 
    AND RIGHT(t.MATNR, 1) = 'C'
-- 若一个物料号对应多个C结尾记录,GROUP BY确保返回唯一值
GROUP BY m.MATNR, CASE WHEN m.MATNR LIKE '%C' THEN '' ELSE ISNULL(t.MATNR, '') END

方案2:使用子查询直接取值

SELECT 
    m.MATNR,
    CASE
        WHEN m.MATNR LIKE '%C' THEN ''
        -- 取第一个匹配的C结尾物料号,无匹配则返回空
        ELSE (
            SELECT TOP 1 t.MATNR 
            FROM prd.TempTable t 
            WHERE t.MATNR LIKE CONCAT(m.MATNR, '%') 
              AND RIGHT(t.MATNR, 1) = 'C'
        )
    END AS GuaranteeItem
FROM prd.MARA m

关键修正说明

  • 调整CASE判断顺序,优先处理自身以C结尾的情况,逻辑更清晰;
  • 用LIKE CONCAT(m.MATNR, '%')匹配所有以当前物料号为前缀的记录,再通过RIGHT(t.MATNR, 1) = 'C'确保是C结尾的目标物料;
  • 针对多匹配场景,用GROUP BY或TOP 1保证每个物料号只返回一个结果(若业务允许多匹配,可根据需求调整为取最长/最新记录等)。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:13:12