2010-11-15 70 views
1

我讀過2005年的帖子,人們說SOQL不支持字符串連接。是否可以在SOQL中連接字符串?

雖然想知道是否支持,並有人已經這樣做。

我想Concat的,但沒有運氣:(

下面是APEX代碼試圖找到紀錄指定的電子郵件。

String myEmail = '[email protected]'; 
String foo = 'SELECT emailTo__c, source__c FROM EmailLog__c 
       WHERE source__c = \'' + 
       myEmail + '\'; 

Database.query(foo) 

即使記錄確實是在數據庫中,它無法查詢任何東西。調試顯示 「行(0)」,這意味着空返回。

我做錯CONCAT走錯了路?

UPDATE

我剛剛發現一種方法不必添加單引號。只需要對具有查詢的字符串應用相同的冒號變量即可。

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

爲什麼使用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

+0

原因之一是因爲我有3個字段,如果用戶指定了任何字段,那些字段(即表列)用於構造查詢。例如,如果用戶輸入'firstname'和'lastname'字段,查詢將看起來像SELECT all FROM fooTable WHERE firstname = $ userinput AND lastname = $ userinput; – 2010-11-16 04:29:36

+0

在這種情況下,我只能連接'firstname = $ userinput AND'等等任何替代方法? – 2010-11-16 04:30:31

+1

當然,您可以綁定多個變量'[SELECT Id FROM EmailLog__c WHERE column1 =:input1 AND colum2 = input2]'...但是,您將放置的發燒友邏輯,可讀性較差的查詢將會......因此,在您案例動態查詢看起來是不錯的選擇。但我仍然有另一種選擇:全文搜索。搜索SOSL的文檔。 http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/langCon_apex_SOQL.htm?SearchType=Stem和我的答案http://stackoverflow.com/questions/3122038/how/ 3139653#3139653(關於控制器的部分)。 – eyescream 2010-11-16 06:39:26

相關問題