SQL Adapter LIKE查询无结果无报错问题求助
问题分析与解决
你的问题根源非常明确:LIKE查询缺少通配符(%)。当使用LIKE但不添加通配符时,它的行为和=完全一致——只会匹配完全相等的内容,所以输入"examp"这类部分字符串时自然没有结果返回。
具体问题拆解
看你提供的SQL片段:
SELECT CUST_ID, EMAIL_ADDR, PHONE_NUM, FIRST_NAME, LAST_NAME, ADDR1, ADDR2, CITY_NAME, PROV_ST_CDE, POST_ZIP_CDE, NOTES_TXT, DLR_CDE, ANALYS_TXT FROM GS_DBA.CUI_CUST_INFO WHERE (lower(EMAIL_ADDR) LIKE lower(?) ...
这里的lower(?)只是把参数转成小写,但没有包裹通配符,数据库会把它当作完整的匹配值来查找,效果和直接用lower(EMAIL_ADDR) = lower(?)完全一样。
修复方案
你需要在参数前后添加%通配符,告诉数据库要匹配包含该字符串的任意内容。修改后的代码应该是这样:
var FIND_CUSTOMER_PREPARED_STATEMENT = WL.Server.createSQLStatement( "SELECT CUST_ID, " + "EMAIL_ADDR, PHONE_NUM, FIRST_NAME, LAST_NAME, ADDR1, ADDR2, CITY_NAME, PROV_ST_CDE, " + "POST_ZIP_CDE, NOTES_TXT, DLR_CDE, ANALYS_TXT FROM " + "GS_DBA.CUI_CUST_INFO WHERE " + "(lower(EMAIL_ADDR) LIKE '%' || lower(?) || '%' OR ..." );
这里用||来拼接通配符和参数(不同数据库的字符串拼接符可能不同:比如SQL Server用+,MySQL用CONCAT,如果你的数据库不是Oracle这类用||的,要对应调整)。
额外适配提示
- 如果你只想匹配以输入内容开头的邮箱,就只用前面的
%:lower(?) || '%' - 如果只想匹配以输入内容结尾的邮箱,就只用后面的
%:'%' || lower(?) - 也可以用数据库自带的拼接函数增强兼容性,比如MySQL可以写成:
CONCAT('%', lower(?), '%')
内容的提问来源于stack exchange,提问作者Nickesh Maharjan
相关产品推荐
相关产品推荐

