SQL Server 2022:如何匹配拼接值到临时表并填充GuaranteeItem列
修正SQL Server中物料号匹配逻辑实现GuaranteeItem赋值需求
原SQL的核心问题
- 通配符使用错误:
CONCAT(prd.MARA.MATNR, '%C')将%作为普通字符拼接,而IN是精确匹配,无法匹配临时表中类似1010080PC的真实值——%只有在LIKE语句中才是通配符。 - 关联条件无效:
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
相关产品推荐
相关产品推荐

