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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:53:01