1

私は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)

レコードは実際にデータベースにありますが、何もクエリしません。デバッグは「row(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);

これも機能し、WHERE句にDateTimeが含まれている場合は、DateTimeを一重引用符で囲むことができないため必要です。

4

1 に答える 1

4

なぜ Database.query() を使用するのですか? 括弧で通常のクエリを使用すると、物事ははるかに簡単で高速になります

[SELECT emailTo__c, source__c FROM EmailLog__c WHERE source__c = :myEmail]

言うまでもなく、文字列連結の代わりにパラメータ バインドを使用すると、SQL インジェクションなどを心配する必要がなくなります。これらの括弧内のクエリに慣れることを検討してください。最初は奇妙に見えますが、何度も問題を解決できます (フィールド名の入力ミスなど)。

実際の連結に関しては、あなたが説明したように機能しますが、アポストロフィをエスケープする必要があるかどうかはわかりません。変数をバインドするのが最も安全な方法です。

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dynamic_soql.htm http://www.salesforce.com/us/developer/docs/api/index_Left.htm#CSHID=sforce_api_calls_soql.htm |StartTopic=Content%2Fsforce_api_calls_soql.htm|SkinName=webhelp

于 2010-11-15T11:54:34.957 に答える