在SSRS中使用LIKE或CONTAINS判断两列是否包含于另一列
SSRS表达式判断字段包含关系的正确实现
首先,你的原表达式存在几处语法和逻辑错误,具体问题及修正方案如下:
原表达式的问题
- 拼写错误:
Field!column1.value应为Fields!column1.Value(复数Fields,属性名首字母大写Value) - 方法调用错误:
.lower().tostring()顺序颠倒且不符合.NET命名规范,应改为.ToString().ToLower() - 通配符误用:
String.Contains方法不需要*通配符,它直接匹配子串,加*会把星号当成普通字符去匹配 - 括号不匹配:逻辑判断的括号未正确闭合,
or的位置导致逻辑结构混乱 - 函数混用:
lcase是VBA函数,在SSRS表达式中建议统一使用.NET的字符串方法
正确的实现方式
方式1:使用.NET的String.Contains方法(推荐)
该方法直接判断子串是否存在,无需通配符,写法简洁高效:
=IIF( Fields!column3.Value.ToString().ToLower().Contains(Fields!column1.Value.ToString().ToLower()) OR Fields!column3.Value.ToString().ToLower().Contains(Fields!column2.Value.ToString().ToLower()), "Yes", "No" )
说明:统一转小写是为了忽略大小写匹配,如果需要严格区分大小写,去掉.ToLower()即可。
方式2:使用VBA的Like运算符(模拟SQL LIKE逻辑)
如果你习惯SQL的LIKE语法,也可以用SSRS支持的Like运算符,此时需要用*作为通配符:
=IIF( LCase(Fields!column3.Value) Like "*" & LCase(Fields!column1.Value) & "*" OR LCase(Fields!column3.Value) Like "*" & LCase(Fields!column2.Value) & "*", "Yes", "No" )
说明:LCase用于统一转小写,忽略大小写;如果要区分大小写,去掉LCase即可。
额外注意事项
- 如果字段可能为
Null,建议先做空值判断,避免报错,比如:
=IIF( (Not IsNothing(Fields!column1.Value) AndAlso Fields!column3.Value.ToString().ToLower().Contains(Fields!column1.Value.ToString().ToLower())) OR (Not IsNothing(Fields!column2.Value) AndAlso Fields!column3.Value.ToString().ToLower().Contains(Fields!column2.Value.ToString().ToLower())), "Yes", "No" )
- 优先推荐方式1,因为
.Contains是.NET原生方法,性能和兼容性更好。
内容的提问来源于stack exchange,提问作者EMPOWER EXCEL
相关产品推荐
相关产品推荐

