Crystal 2008非完全匹配字符串查询问题求助
Crystal Reports 2008 地址匹配筛选解决方案
问题分析
你需要匹配Address(仅街道名)和AddressB(街道名+额外信息)的记录,之前用startswith和LIKE失效,大概率是Crystal公式语法细节或字符串隐藏字符导致。以下是几种可靠的解决方法:
方法1:用InStr函数编写判断公式
Crystal的InStr函数可以精准检测子字符串的起始位置,比startswith更稳定。
- 创建新公式字段,输入以下代码:
// 基础匹配:检查Address是否是AddressB的开头 If InStr({AddressB}, {Address}) = 1 Then {AddressB} Else "ERROR"
- 如果存在字符串前后空格干扰,添加
Trim处理:
// 去除空格后匹配 If InStr({AddressB}, Trim({Address})) = 1 Then {AddressB} Else "ERROR"
方法2:直接在选择专家中过滤匹配记录
如果不需要显示"ERROR"记录,直接在报表层面过滤更高效:
- 点击菜单栏
Report > Selection Formula > Record - 输入筛选公式:
InStr({AddressB}, {Address}) = 1
- 保存后报表只会显示地址匹配的记录。
方法3:用SQL表达式字段(数据源层匹配,效率更高)
如果你的数据库支持,直接在数据源层面做匹配性能更好:
- 创建SQL表达式字段(
Database > SQL Expression Fields > New) - 根据数据库类型选择对应语法:
- SQL Server:
CHARINDEX("{Address}", "{AddressB}") = 1- Oracle:
INSTR("{AddressB}", "{Address}") = 1 - 将该表达式用于筛选条件或显示判断。
为什么之前的方法失效?
startswith:Crystal 2008的startswith函数对参数顺序、字符串特殊字符(如隐藏空格)敏感,容易匹配失败。LIKE:正确写法应为{AddressB} LIKE {Address} + "*",但字符串拼接时若存在空格或特殊字符,也会导致匹配失效,不如InStr稳定。
内容的提问来源于stack exchange,提问作者zach123
相关产品推荐
相关产品推荐

