Возможно ли объединение строк в SOQL?
-
10-10-2019 - |
Вопрос
Я читал поток от 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