如何通过PHP调用Salesforce API用IN条件批量查询Account邮箱
问题:如何在Salesforce SOQL查询中使用IN条件替代OR批量查询邮箱对应的Account记录
我有一个PHP数组格式的邮箱列表,需要通过Curl调用Salesforce API,查询其中哪些邮箱已对应Salesforce的Account记录,并获取这些记录的Id存入本地系统。目前已实现用OR条件拼接邮箱的查询:
$query = "query/?q="; $sql = "SELECT+Id,+Email+FROM+Account+WHERE+Email='example1@gmail.com'+OR+Email='random@name.net'"; $url = $domain . $api . $query . $sql;
但邮箱列表过长,希望改用类似SQL的IN条件查询,比如:
"SELECT Id, Email FROM Account WHERE Email IN (" . $emails . ")"
尝试后报错:“bind variables only allowed in apex code - malformed query”,请问如何实现用IN条件替代OR的查询?
解决方案
正确格式化IN条件的SOQL语法:SOQL的IN条件要求括号内的每个值必须用单引号包裹,且以英文逗号分隔。你需要先将PHP数组中的邮箱处理为符合该格式的字符串,同时转义邮箱内的单引号,避免语法错误或注入风险。
示例PHP代码:
// 假设$emailList是你的邮箱数组 $emailList = ["example1@gmail.com", "random@name.net", "test@domain.com"]; // 格式化邮箱:转义单引号+包裹单引号,再拼接成字符串 $formattedEmails = implode(',', array_map(function($email) { return "'" . str_replace("'", "\\'", $email) . "'"; }, $emailList)); // 构造SOQL语句 $sql = "SELECT Id, Email FROM Account WHERE Email IN (" . $formattedEmails . ")"; // 对查询语句做URL编码,确保特殊字符被正确处理 $encodedSql = urlencode($sql); $query = "query/?q="; $url = $domain . $api . $query . $encodedSql;注意IN条件的数量限制:Salesforce SOQL规定IN条件的取值不能超过1000个。如果你的邮箱列表超过该数量,需要拆分数组分批执行查询,最后合并结果集。
优先使用URL编码:之前的OR查询用
+代替空格不够严谨,建议对整个SOQL语句执行urlencode,避免特殊字符导致的查询语法错误。
内容的提问来源于stack exchange,提问作者Lou Nik
相关产品推荐
相关产品推荐

