SOQLで文字列を連結することは可能ですか?
-
10-10-2019 - |
質問
私は2005年からスレッドを読みましたが、人々はSOQLが文字列の連結をサポートしていないと言いました。
それがサポートされていて、誰かがこれを行ったのではないかと思っています。
私は連結しようとしていますが、運はありません:(
以下は、指定された電子メールでレコードを見つけようとするApexコードです。
String myEmail = 'my@email.com';
String foo = 'SELECT emailTo__c, source__c FROM EmailLog__c
WHERE source__c = \'' +
myEmail + '\';
Database.query(foo)
レコードは確かにデータベースにありますが、何も照会しません。デバッグには、空が返されることを意味する「行(0)」に表示されます。
私は間違った方法でconcatをしていますか?
アップデート
単一の引用を追加する必要がない方法を見つけました。クエリがある文字列にも同じコロン変数を適用する必要がありました。
String foo = DateTime.newInstance(......);
String bar = 'SELECT id FROM SomeObject__c WHERE createdOn__c = :foo';
List<SomeObject__c> result = Database.query(bar);
System.debug(result);
これも機能し、DateTimeを単一の引用に囲まれていないため、句がDateTimeを含む場合に必要です。
解決
なぜdatabase.query()を使用するのですか?ブラケットで通常のクエリを使用すると、ものははるかにシンプルで高速になります
[SELECT emailTo__c, source__c FROM EmailLog__c WHERE source__c = :myEmail]
言うまでもなく、文字列の連結の代わりにパラメーターのバインディングは、SQLインジェクションなどを心配する必要はないことを意味します。ブラケットのこれらのクエリに慣れることを検討してください、それらはbeginnignで奇妙に見えますが、何度も尻を節約します(間違いのあるフィールド名など)。
実際の連結に関しては、あなたがそれを説明したように機能しますが、アポストロフィを逃れる必要性がわからないだけです。変数をバインドすることは、最も安全な方法です。
http://www.salesforce.com/us/developer/docs/apexcode/content/apex_dynamic_soql.htmhttp://www.salesforce.com/us/developer/docs/api/index_left.htm#cshid = sforce_api_calls_soql.htm|starttopic=content%2ffsforce_api_calls_soql.htm|