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 的评论。