2010-11-15 17 views
1

J'ai lu un thread à partir de 2005 et les gens ont dit que SOQL ne supporte pas la concaténation de chaînes. Bien que je me demande si c'est supporté et que quelqu'un l'a fait.Est-il possible de concaténer des chaînes dans SOQL?

Je suis en train de concaténer mais pas de chance :(

est le code ci-dessous APEX essayant de trouver record avec e-mail indiquée.

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

Database.query(foo) 

Même si le dossier est en effet dans la base de données, il ne pas interroger quoi que ce soit. Debug affiche "ligne (0)" qui signifie vide est retourné.

que je fais concat mauvaise façon?

MISE À JOUR

Je viens de trouver un moyen de ne pas avoir à ajouter une seule citation. Juste nécessaire d'appliquer la même variable de deux points même pour la chaîne qui a une requête.

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); 

Cela fonctionne également et est nécessaire si la clause WHERE contient DateTime, car DateTime ne peut pas être entouré de guillemets simples.

Répondre

4

Pourquoi utilisez-vous Database.query()? La substance sera beaucoup plus simple et plus rapide si vous utilisez des requêtes normales entre parenthèses

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

Sans oublier que la liaison de paramètre au lieu de concaténation de chaîne signifie pas besoin de se soucier des injections SQL, etc .. S'il vous plaît, songez à utiliser à ces questions entre parenthèses, ils ont l'air bizarre dans beginnign mais vont enregistrer votre butt plusieurs fois (noms de champs mal typés, etc). En ce qui concerne la concaténation réelle - cela fonctionne comme vous l'avez décrit, je ne suis pas sûr de la nécessité d'échapper aux apostrophes. Relier les variables est le moyen le plus sûr d'aller.

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

L'une des raisons est parce que j'ai 3 champs et si un utilisateur spécifie un quelconque, ces champs (c'est-à-dire la colonne de la table) sont utilisés pour construire la requête. Par exemple, si l'utilisateur saisit le champ 'prénom' et 'nom de famille', la requête ressemblerait à SELECT tout FROM fooTable WHERE prénom = $ userinput ET lastname = $ userinput; –

+0

Dans un tel cas, je ne peux concat que 'firstname = $ userinput AND' etc. –

+1

Bien sûr, vous pouvez lier plusieurs variables '[SELECT ID FROM EmailLog__c WHERE colonne1 =: input1 ET colum2 = input2]' ... Mais la logique plus chic que vous mettrez, la requête moins lisible sera ... Alors oui, dans votre La requête dynamique de cas ressemblait à un bon choix. Mais j'ai encore une autre option pour vous: recherche en texte intégral. Recherche de documentation pour SOSL. http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/langCon_apex_SOQL.htm?SearchType=Stem et ma réponse http://stackoverflow.com/questions/3122038/how/ 3139653 # 3139653 (partie sur le contrôleur). – eyescream