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;
关键逻辑说明
正则匹配规则
- 正则模式
(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个匹配的子串,保证按出现顺序取第一个符合条件的数字。
- 正则模式
规则转换
- 将提取到的数字转为整数后,按区间判断返回对应标识:21-29返回20,31-39返回30,其余直接返回原数字。
空值处理
- 若物料编码中无符合条件的数字,
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
相关产品推荐
相关产品推荐

