You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apex中SOQL使用两种String数组查询结果不一致原因求解

问题背景

有一个名为boatNames__mdt的自定义元数据对象,通过两种方式获取Picklist值存入String数组,使用相同逻辑的SOQL查询时返回结果不一致。

实现方式

第一种:从自定义元数据文本区域字段取值

Map<String, boatNames__mdt> mapEd = boatNames__mdt.getAll();
string boatTypes = (string) mapEd.values()[0].BoatPick__c;
// BoatPick__c是一个文本区域字段(示例值:'Yacht, Sailboat')
string[] btWRAP = new string[]{};
btWRAP.addAll(boatTypes.normalizeSpace().split(','));

第二种:从Picklist字段描述中取值

string[] strL = new string[]{};
Schema.DescribeFieldResult dfr = Schema.SObjectType.boatNames__mdt.fields.BoatTypesPicklist__c;
// BoatTypesPicklist__c是一个picklist字段(可选值:'Yacht, Sailboat')
PicklistEntry[] picklistValues = dfr.getPicklistValues();

for (PicklistEntry pick : picklistValues){
    strL.add((string) pick.getLabel());
}

SOQL查询代码

Map<Id, BoatType__c> boatMap =  new Map<Id, BoatType__c>
    ([Select Id, Name from BoatType__c Where Name in :btWRAP]);

问题现象

绑定btWRAP数组执行SOQL无记录返回,绑定strL数组执行则可以正常返回记录。

原因分析
  • 核心差异是btWRAP数组的元素存在多余的首尾空格:文本区域字段示例值为Yacht, Sailboat,调用split(',')分割后,得到的数组元素为['Yacht', ' Sailboat'],第二个元素开头存在空格。normalizeSpace()仅会将字符串首尾的空格以及内部连续的多个空格替换为单个空格,不会清除逗号和后续内容之间的单个分隔空格。
  • strL数组的元素来自Picklist选项的Label,本身没有多余的前后空格,和BoatType__c的Name字段值完全匹配,因此可以正常返回结果。
  • Salesforce SOQL的字符串匹配为精确匹配,空格、大小写不一致都会导致匹配失败,因此带空格的btWRAP元素无法匹配到对应记录。

修复方案

修改第一种方法的分割逻辑,分割后对每个元素调用trim()清除前后空格,或者直接用正则匹配分割逗号及后续的任意空格:

// 方案1:分割后逐个trim
for(String s : boatTypes.normalizeSpace().split(',')){
    btWRAP.add(s.trim());
}
// 方案2:用正则分割
btWRAP.addAll(boatTypes.normalizeSpace().split(',\\s*'));

内容的提问来源于stack exchange,提问作者Ionut Sultana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:57:01