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

SAP B1/HANA查询优化:物料编码中匹配首个指定数字

解决SAP B1/HANA中物料编码的DOPPEL-CHECK列提取问题

问题分析

你之前的CASE WHEN逻辑错误在于按数字值从小到大匹配,而非按数字在字符串中出现的顺序匹配,导致长数字串里的小数字(比如810里的1)被优先匹配,而非第一个出现的符合条件的数字。

核心需求是:从左到右扫描物料编码,找到第一个出现的0-39范围内的数字(支持两位数字,如10、25),再按规则转换(21-29返回20,31-39返回30,其余返回自身)。

修正后的SQL查询

SELECT
    ItemCode,
    CASE
        WHEN extracted_num IS NULL THEN '' -- 无匹配时的默认值,可按需调整
        WHEN CAST(extracted_num AS INTEGER) BETWEEN 21 AND 29 THEN '20'
        WHEN CAST(extracted_num AS INTEGER) BETWEEN 31 AND 39 THEN '30'
        ELSE extracted_num
    END AS "DOPPEL-CHECK"
FROM (
    SELECT
        ItemCode,
        -- 提取第一个出现的0-39数字,优先匹配两位数字
        REGEXP_SUBSTR(ItemCode, '(3[0-9]|2[0-9]|1[0-9]|[0-9])', 1, 1) AS extracted_num
    FROM OITM
) t;

关键逻辑说明

  1. 正则匹配规则

    • 正则模式(3[0-9]|2[0-9]|1[0-9]|[0-9])会优先匹配两位数字(30-39、20-29、10-19),再匹配一位数字(0-9),避免将两位数字拆分为单个字符匹配(比如25会被完整识别为25,而非先匹配2)。
    • REGEXP_SUBSTR的1,1参数指定从字符串第1位开始,提取第1个匹配的子串,保证按出现顺序取第一个符合条件的数字。
  2. 规则转换

    • 将提取到的数字转为整数后,按区间判断返回对应标识:21-29返回20,31-39返回30,其余直接返回原数字。
  3. 空值处理

    • 若物料编码中无符合条件的数字,extracted_num会返回NULL,这里设置默认为空字符串,可根据业务需求改为其他值(比如'N/A')。

特殊场景验证

  • 对于物料编码SS-810-3-8-6:第一个出现的符合条件的数字是8,最终返回8,符合你的预期。
  • 对于物料编码AB-25-CD:会优先匹配两位数字25,转换后返回20。
  • 对于物料编码XY-37-EF:匹配37,转换后返回30。
  • 对于物料编码12-ABC-5:第一个匹配的是12,直接返回12。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:22:33