是否可以在SOQL中连接字符串?

时间:2010-11-15 10:21:21

标签: concatenation salesforce apex-code visualforce soql

我读过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)”表示返回空。

我做错了吗?

更新

我刚发现一种不必添加单引号的方法。即使对于有查询的String,也只需要应用相同的冒号变量。

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不能用单引号括起来。

1 个答案:

答案 0 :(得分:4)

为什么使用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.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