Вопрос

Я читал поток от 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);

Это тоже работает и необходимо, если предложение WHERE содержит DateTime, поскольку DateTime не может быть заключено в одинарные кавычки.

Это было полезно?

Решение

Почему вы используете Database.запрос()?Все будет намного проще и быстрее, если вы будете использовать обычные запросы в квадратных скобках

[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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top