Jitterbitを使用してSalesforceからレコードをクエリしていますが、問題が発生しています。クエリ条件ステートメントで、Salesforceテーブルの2つのフィールドを比較しています。クエリをテストしようとすると、「バインド変数はApexコード[MALFORMEDQUERY]でのみ許可されています」というエラーが表示されます。
クエリの例を次に示します。
SELECT Id FROM Price_Agreement_Item__c WHERE Approved_Date__c > Last_Upload_Date__c
フィールド Approved_Date__c
およびLast_Upload_Date__c
は両方ともSalesforceテーブルに含まれていますPrice_Agreement_Item__c
。テーブル内の2つのフィールドを比較するselectステートメントを条件付けるSOQLステートメントをどのように作成しますか?
どんな助けでも大歓迎です。
前もって感謝します。
Daniel Ballingerが言ったことに加えて、SoapAPIはSOQLクエリで「IN」句を許可しません。ばかげていますが、これもSalesforceの95%です。
SOQLは現在、WHERE句でのフィールド間の直接比較をサポートしていません。 From SOQLのWHERE句でのフィールド間の比較
SOQLのWHERE句でのフィールド間の比較
ナレッジ記事番号:000187460
説明
WHERE句で同じオブジェクトの2つのフィールドを比較してクエリを実行したいのですが、WHERE句で条件の右側のフィールドを使用できません。List<user> users = [SELECT Id,name FROM User WHERE (FirstName != Lastname)];
上記のクエリは次を返します: "System.QueryException:予期しないトークン: '姓'"
解決策
Salesforceでは、SOQLクエリでのフィールド間の直接比較は許可されていません。これを実現するために、フィールドを比較し、WHERE句で使用できる値(trueまたはfalseなど)を返す数式フィールドを作成できます。
したがって、上記のクエリでは、戻り値の型がテキストのUserオブジェクトに数式フィールドを作成できます。 NameCompare、式IF(User.FirstName!= User.LastName、 'true'、 'false')
これで、クエリは次のようになります。
List<User> Users = [SELECT id, name FROM User where NameCompare= 'true'];
SOQLでフィールド間の比較を可能にするために、次のアイデアがideaexchangeポータルに投稿されました。
https://success.salesforce.com/ideaView?id=08730000000BrHAAA
チェックボックスタイプの 数式フィールド を作成して、ブール値を返すことができます。
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固有の質問をするのに最適な場所です。この回答は、JesseAltmanが回答した質問とKeithCおよびsfdcfoxのコメントを参照しています。
これが発生する可能性のある別の方法は、クエリをコマンドラインにコピーして、文字列定数の前後の引用符をエスケープせずに実行する場合です。
例:これ:
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