如何让SELECT语句中的LIKE查询实现不区分大小写匹配?
ABAP Open SQL 实现大小写不敏感LIKE查询的解决方案
你之前写法报错的核心原因是 ABAP Open SQL 不允许在LIKE操作符的右侧使用SQL函数/表达式,仅支持常量、主机变量(带@前缀的ABAP变量),此外直接写数据库特有的排序规则名(如utf8_general_ci)不符合Open SQL数据库无关的语法规范。
通用兼容方案(支持ABAP 7.40 SP05及以上版本,适配所有数据库类型)
你只需要提前在ABAP层把搜索字符串转成小写,再在WHERE条件中仅对查询列调用LOWER函数即可,写法如下:
" 提前把搜索参数转小写,再拼接通配符 DATA(tst_string) = '%' && to_lower( importedParamter ) && '%'. IF anotherParameter IS NOT INITIAL. IF importedParamter IS NOT INITIAL. SELECT * FROM <table1> as p INNER JOIN <table2> as q on q~column1 = p~column1 WHERE p~column2 = @anotherParameter " 仅对数据库列调用LOWER函数,右侧传提前转好小写的主机变量 AND LOWER( q~column2 ) LIKE @tst_string INTO CORRESPONDING FIELDS OF TABLE @anotherName. ENDIF. ENDIF.
高版本可选方案(ABAP 7.55及以上版本支持)
如果你的系统版本足够高,可以直接用Open SQL原生支持的不区分大小写排序规则,不需要手动转大小写,写法如下:
DATA(tst_string) = '%' && importedParamter && '%'. IF anotherParameter IS NOT INITIAL. IF importedParamter IS NOT INITIAL. SELECT * FROM <table1> as p INNER JOIN <table2> as q on q~column1 = p~column1 WHERE p~column2 = @anotherParameter AND q~column2 LIKE @tst_string COLLATE #NON_CASE_SENSITIVE INTO CORRESPONDING FIELDS OF TABLE @anotherName. ENDIF. ENDIF.
注意事项
- LOWER转大小写的方案兼容性最好,几乎所有当前在用的ABAP系统都支持
- 如果你的查询数据量非常大,建议给对应字段创建基于
LOWER(columnName)的函数索引,避免全表扫描影响性能
内容的提问来源于stack exchange,提问作者user16365685
相关产品推荐
相关产品推荐

