ABAP 7.40中SELECT语句@IM_NAME LIKE ZZPATTN语法错误求助
解决方案
错误原因
ABAP Open SQL 的 LIKE 操作符有严格语法限制:左侧必须是数据库表字段,右侧只能是常量、变量或合法表达式。你当前将变量 @IM_NAME 放在左侧、表字段 ZZPATTN 放在右侧,违反了这一规则,导致语法报错。
可行方案
方案一:使用 CONTAINS 谓词(推荐)
ABAP 7.40 支持 CONTAINS 谓词,允许将变量作为待匹配源,表字段作为模式(原生支持 * 通配符),直接实现你的匹配需求:
SELECT ZZPRICE, ZZEFDAT INTO ( @PRICE, @EFDAT ) FROM ZZPRICE UP TO 1 ROWS WHERE ( ( 'X' <> @LV_FLG AND ZZNAME = @IM_NAME ) OR ( 'X' = @LV_FLG AND CONTAINS( @IM_NAME, ZZPATTN ) ) ) ENDSELECT.
方案二:转换匹配逻辑适配 LIKE 语法
由于你的 ZZPATTN 均为「前缀+*」的固定格式,可将逻辑转换为:检查 ZZPATTN 去掉 * 后的前缀,是否与 IM_NAME 的对应前缀一致,同时保留 * 后缀的特征(符合 LIKE 左字段、右表达式的要求):
SELECT ZZPRICE, ZZEFDAT INTO ( @PRICE, @EFDAT ) FROM ZZPRICE UP TO 1 ROWS WHERE ( ( 'X' <> @LV_FLG AND ZZNAME = @IM_NAME ) OR ( 'X' = @LV_FLG AND ZZPATTN LIKE CONCAT( SUBSTRING( @IM_NAME, 1, STRLEN( ZZPATTN ) - 1 ), '*' ) ) ) ENDSELECT.
方案三:动态 SQL 构造条件(复杂场景适配)
若上述方案不满足需求,可通过动态 SQL 构造合法的 WHERE 条件:
DATA(lv_dynamic_cond) = |@IM_NAME LIKE REPLACE( ZZPATTN, '*', '%' )|. SELECT ZZPRICE, ZZEFDAT INTO ( @PRICE, @EFDAT ) FROM ZZPRICE UP TO 1 ROWS WHERE ( ( 'X' <> @LV_FLG AND ZZNAME = @IM_NAME ) OR ( 'X' = @LV_FLG AND (lv_dynamic_cond) ) ) ENDSELECT.
注意事项
- 确保 ABAP 7.40 的 SP 版本(建议 SP05 及以上)支持
CONTAINS、SUBSTRING、REPLACE等 Open SQL 内置函数; - 若
ZZPATTN存在非「前缀+*」的模式,需调整方案二的逻辑,比如先统一将*替换为%再处理。
内容的提问来源于stack exchange,提问作者user29774157
相关产品推荐
相关产品推荐

