在测试从Jitterbit调用的SOQL语句时,我收到错误"仅在Apex代码中允许绑定变量[MALFORMED QUERY]"

Nic*_*nco 8 salesforce soql jitterbit

我们使用Jitterbit来查询Salesforce中的记录,但是我们遇到了一个问题.在查询条件语句中,我正在比较Salesforce表中的两个字段.当我去测试查询时,它给出了错误"仅在Apex代码[MALFORMED QUERY]中允许绑定变量".

以下是查询示例:

SELECT Id FROM Price_Agreement_Item__c WHERE Approved_Date__c > Last_Upload_Date__c
Run Code Online (Sandbox Code Playgroud)

字段Approved_Date__cLast_Upload_Date__c都包含在Salesforce表Price_Agreement_Item__c.如何创建一个SOQL语句来调整select语句比较表中的两个字段?

任何帮助表示赞赏.

先感谢您.

abh*_*kbh 19

除了Daniel Ballinger所说的,Soap API也不允许在SOQL查询中使用'IN'子句.这是愚蠢的,但是再一次,这是Salesforce的95%.

  • 最后一句话.你走吧! (5认同)

Dan*_*ger 6

SOQL当前不支持WHERE子句中的直接字段到字段比较.从SOQL的WHERE子句中的字段到字段比较

SOQL的WHERE子句中的字段到字段比较

知识产品编号:000187460

描述
我想通过比较WHERE子句中同一对象的两个字段来执行查询,但是我无法在WHERE子句中使用条件右侧的字段:

List<user> users = [SELECT Id,name FROM User WHERE (FirstName != Lastname)];
Run Code Online (Sandbox Code Playgroud)

上面的查询返回:"System.QueryException:unexpected token:'Lastname'"

解决方案
Salesforce不允许在SOQL查询中进行直接的字段到字段比较.

为此,您可以创建一个公式字段,该字段将比较字段并返回您可以在WHERE子句中使用的值(如true或false).

因此,对于上面的查询,您可以在User对象上创建一个公式字段,返回类型为Text,例如NameCompare,公式为IF(User.FirstName!= User.LastName,'true','false')

现在我们的查询将是:

List<User> Users = [SELECT id, name FROM User where NameCompare= 'true'];
Run Code Online (Sandbox Code Playgroud)

在ideaexchange门户上发布了以下想法,允许在SOQL中进行字段到字段的比较:

https://success.salesforce.com/ideaView?id=08730000000BrHAAA0

您可以创建类型为Checkbox 的公式字段以返回布尔值:

Approved_Date__c > Last_Upload_Date__c
Run Code Online (Sandbox Code Playgroud)

然后使用WHERE子句重写您的查询,如:

SELECT Id  
FROM Price_Agreement_Item__c 
WHERE Approved_Date_Greater_Than_Last_Upload_Date__c = true
Run Code Online (Sandbox Code Playgroud)

请注意扫描需要多少行.它不能使用索引,因此将导致全表扫描.如果行数太大,您可能会遇到其他错误.

顺便提一下,Salesforce Stack Exchange是询问Salesforce特定问题的好地方.这个答案引用了Jesse Altman在回答问题时提出的问题以及Keith C和sfdcfox的评论.