9

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

下面是一个查询示例:

SELECT Id FROM Price_Agreement_Item__c WHERE Approved_Date__c > Last_Upload_Date__c

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

任何帮助表示赞赏。

先感谢您。

4

3 回答 3

33

除了 Daniel Ballinger 所说的之外,Soap API 也不允许在 SOQL 查询中使用“IN”子句。这很愚蠢,但话又说回来,这是 Salesforce 的 95%。

于 2014-10-22T21:18:39.303 回答
7

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

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

知识文章编号:000187460

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

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

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

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

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

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

现在我们的查询将是:

List<User> Users = [SELECT id, name FROM User where NameCompare= 'true'];

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

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

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

Approved_Date__c > Last_Upload_Date__c

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

SELECT Id  
FROM Price_Agreement_Item__c 
WHERE Approved_Date_Greater_Than_Last_Upload_Date__c = true

注意这需要扫描多少行。它不能使用索引,所以会导致全表扫描。如果行数太大,您可能会遇到其他错误。

顺便说一句,Salesforce Stack Exchange是询问 Salesforce 特定问题的好地方。这个答案引用了 Jesse Altman 回答的一个问题,以及 Keith C 和 sfdcfox 的评论。

于 2014-07-26T09:10:41.463 回答
2

发生这种情况的另一种方法是,如果您将查询复制到命令行并运行它,而不转义任何字符串常量周围的引号。

例如,这个:

curl -X GET https://x.salesforce.com/services/data/v31.0/query?q=SELECT%20COUNT\(\)%20FROM%20YourObj%20WHERE%20field%20!=%20'Good'

应该是这样的:

curl -X GET https://x.salesforce.com/services/data/v31.0/query?q=SELECT%20COUNT\(\)%20FROM%20YourObj%20WHERE%20field%20!=%20%27Good%27
于 2015-10-05T22:56:18.280 回答