codingHeart

返回顶部

(通用版)salesforce中soql及sosl的伪‘Like’模糊检索

  salesforce里有soql、sosl两种查询语法,soql针对模糊搜索也有‘like’关键字,然而只能针对其自带字段如:Name、Id;对于自定义添加的字段如:Message__c、Note__c采用‘like’模糊检索则会报错。

然而,一般情况业务需求上更多的会对自定义字段有模糊检索的需求,因此对此作了一些调查,然而国内salesforce并不流行,论坛博客相关讨论也很少,参考了部分JP博客、官方的相关文档,总结出两种思路来应对自定义字段模糊检索问题。

一、通过sosl(salesforce object search language)的find关键字实现

  FIND ‘sear*’ IN ALL FIELDS RETURNING Table__c 

  思路:通过find的search语句执行得到一个模糊检索的结果集,然后将结果集中的id取出放入集合内,再在主soql文中加入‘id in (模糊搜索记录的id集合)’的where条件从而达到模糊查询的目的。

复制代码
if (note != null && note != '') {
          String findQuery = 'FIND \'' + note + '*\' IN ALL FIELDS RETURNING Test__c';
          List<List<sobject>> results = search.query(findQuery);
          Set<Id> ids = new Set<Id>();
          for(List<sobject> result: results){
            for(sobject obj : result){
              ids.add(obj.Id);
            }
          }
          string strIds = '';
          Integer i = 0;
          for (String str : ids) {
            if(i != ids.size()-1)
            {
              strIds += '\''+str+'\'';
              strIds +=  ',';
              }else{
                strIds += '\''+str+'\'';
              }
              i++;
            }
            if(strIds != null && strIds != '')
            {
              soql += ' And id IN ('+strIds+')';
            }else{
              soql += ' And id = '+'\'\'';
            }
          }
复制代码

  通过文档说明和测试发现:

  1. Sosl的模糊检索‘find’只能完成单词、词组以及‘hap%’这种检索,对‘%hap%’这种无能为力;
  2. 示例代码是全字段检索(IN ALL FIELDS),按API的用法换成特定列字段检索(IN Note__c FIELDS)会报错,弄得人有点烦躁;

  因此,综合考虑,还是第二种方案更为可靠。

 

二、通过对检索所得结果集的特定字段通过函数进行过滤实现

  obj.col.contain(keyword)

 思路:将soql执行得到的List集合遍历,对各个obj的Note__c字段进行关键字模糊搜索过滤(contain()函数),满足条件的添加到结果List中,最后返回结果List。

复制代码
List<Test__c> temp = database.query(soql);
        List<Test__c> resultList = new List<Test__c>();
        if(strMemo!=null&&strMemo!=''){
          for(Test__c dr:temp){
            if(dr.Note__c!=null&&dr.Note__c!=''){
              if(dr.Msg__c.contains(strMemo)){
                resultList.add(dr);
              }
            }
          }
        }else{
          resultList = temp;
        }
        return resultList;
复制代码

  

  最后说下自己的看法,这种两种方法初看起来都有点效率低下,毕竟比起sql文中like来确实费劲不少,但就实际的页面效果来看并没有多大时间损耗,数据量万条以内可行性还是挺高的。

 

posted on   codingHeart  阅读(2256)  评论(3编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示