SAP HANA SQL:实现拼接值的部分匹配查询需求
正确的SAP HANA SQL查询:筛选包含指定标签的MATNR
我来帮你搞定这个问题,你之前的查询逻辑之所以出现问题,是因为没有正确处理ldis表中LDIS字段的分号分隔多值,导致匹配逻辑要么太严格要么太宽泛。
问题分析
- 第一个查询的逻辑错误:
"VALUE" LIKE '%'||ldis.LDIS||'%'是在检查标签的VALUE是否包含整个LDIS字符串,只有当LDIS刚好等于某个VALUE时才会命中(比如MATNR 126的LDIS是ldi2),自然漏掉了123和124这类包含多个值的记录。 - 第二个查询的逻辑漏洞:
ldis.LDIS LIKE '%'||"VALUE"||'%'虽然能匹配包含目标值的记录,但如果存在类似ldi20这种带后缀的VALUE,会出现误匹配(即使它的标签不含“second”),逻辑上不够严谨。
正确的查询写法
我们需要先把LDIS字段的分号分隔值拆分成单独的行,再和labels表做精确匹配,这样就能准确筛选出符合条件的MATNR。这里提供两种可行的写法:
写法1:使用STRING_SPLIT配合EXISTS
SELECT DISTINCT l.MATNR FROM ldis l JOIN ( -- 先筛选出标签含"second"的所有VALUE SELECT "VALUE" FROM labels WHERE LABEL LIKE '%second%' ) t ON EXISTS ( -- 拆分当前MATNR的LDIS值,检查是否包含目标VALUE SELECT 1 FROM STRING_SPLIT(l.LDIS, ';') s WHERE s.TOKEN = t."VALUE" )
写法2:使用LATERAL VIEW拆分多值后关联
SELECT DISTINCT l.MATNR FROM ldis l -- 将每个MATNR的LDIS拆分成多行记录 LATERAL VIEW STRING_SPLIT(l.LDIS, ';') AS split_ldis -- 关联labels表做精确匹配 JOIN labels lb ON split_ldis.TOKEN = lb."VALUE" -- 筛选标签含"second"的记录 WHERE lb.LABEL LIKE '%second%'
效果说明
这两种写法都会正确返回MATNR为123、124、126的记录,同时避免了误匹配的风险,逻辑更严谨。
内容的提问来源于stack exchange,提问作者Koen Steenhout
相关产品推荐
相关产品推荐

