Поиск…


Синтаксис

  • SELECT Id FROM Account
  • Идентификатор SELECT, имя FROM Account
  • SELECT Id FROM Account WHERE Name = 'SomeAccountName'
  • SELECT Id, Name, (SELECT Id, Name FROM Contacts) FROM Account
  • SELECT Id, Name FROM Account WHERE Id =: apexVariableName

Основной запрос SOQL

SELECT Id, Name FROM Account

Это вернет поля Id и Name из таблицы Account. Никакая фильтрация или сортировка не будут применены.

Запрос SOQL с фильтрацией

SELECT Name FROM User WHERE IsActive = true

Это вернет имя всех активных пользователей.

SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z

Это вернет Контакты, созданные 1 января 2016 года или после этой даты.

SELECT Id, Name FROM Account LIMIT 100

Это вернет первые 100 учетных записей из неупорядоченного списка.

SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'

Это вернет Leads с номером телефона, соответствующим указанному формату. «%» действует как символ дикой карты.

Использование LIKE '% %' также позволяет разработчику реплицировать формулу CONTAINS( ) .

SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'

Вернет Leads с ведущим источником, который содержит Google, т.е. Google AdWords и Google Natural Search.

Запрос SOQL с заказом

SELECT Id, Name FROM User ORDER BY LastName

SELECT Id, Name FROM Contact ORDER BY LastModifiedDate DESC

SELECT Name, Title FROM User ORDER BY Title ASC NULLS FIRST

SELECT Id FROM Contact ORDER BY LastName ASC NULLS LAST, FirstName ASC NULLS FIRST

Использование SOQL для построения карты

Очень полезной особенностью, которую многие люди упускают, является возможность создания Карты с использованием SOQL-запроса.

Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);

Когда вы запускаете этот код, accounts затем содержат карту объектов вашей учетной записи, с ключом на идентификаторе. Выход в журнал отладки будет выглядеть примерно так:

11:15:10:025 USER_DEBUG [13]|DEBUG|{
    XXXXXXXXXXXXXXXXXX=Account:{Id=XXXXXXXXXXXXXXXXXX, Name=Account 1}, 
    YYYYYYYYYYYYYYYYYY=Account:{Id=YYYYYYYYYYYYYYYYYY, Name=Account 2}, 
    ZZZZZZZZZZZZZZZZZZ=Account:{Id=ZZZZZZZZZZZZZZZZZZ, Name=Account 3}, 
    ...
}

Теперь вы можете искать объекты учетной записи, используя свой идентификатор. Кроме того, если вам нужна коллекция уникальных идентификаторов, вы можете вызвать keySet() класса Map, например:

System.debug(accounts.keySet());

который выглядит примерно так в журнале отладки:

11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}

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

SOQL-запрос к полям родительского объекта

Когда объект связан взаимосвязью lookup или master-detail, поле родительских записей может ссылаться на дочернюю запись или «базовый объект» в запросе. Это также известно как обход вверх.

SELECT FirstName, Account.Name, Account.Category__c FROM Contact

Можно пройти пять записей вверх.

SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact

Когда базовый объект является настраиваемым полем поиска, имя __c в имени Primary_Influencer__c, например, будет изменено на __r.

SELECT Primary_Influencer__r.Nickname__c FROM Contact

Запрос SOQL для получения дочерних записей

SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account

Запросы SOQL в Apex

Для выполнения запроса в Apex окружайте запрос квадратными скобками. Результат может быть присвоен списку или одному объекту.

List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];

Переменные ссылки в Apex SOQL-запросах

Чтобы ссылаться на переменную в запросе, добавьте двоеточие (:) перед именем переменной.

Datetime targetDate = Datetime.now().addDays(-7);
List<Lead> recentLeads = [SELECT Id FROM Lead WHERE CreatedDate > :targetDate];

string targetName = 'Unknown';
List<Contact> incompleteContacts = [SELECT Id FROM Contact WHERE FirstName = :targetName];

Потенциальные исключения в запросах SOQL Apex

При назначении одному объекту запрос, возвращающий что-либо, кроме одной строки, QueryException .

try {
    Account a = [SELECT Id FROM Account WHERE Name = 'Non-existent Account'];  
} catch (QueryException e) {
    // List has no rows for assignment to SObject
}

try {
    Account a = [SELECT Id FROM Account];  
} catch (QueryException e) {
    // List has more than 1 row for assignment to SObject
}

Попытка использовать поле, которое вы не включили в запрос, будет SObjectException

Account a = [SELECT Id FROM Account LIMIT 1];
try {
    System.debug( a.Name );
} catch (SObjectException e) {
    // SObject row was retrieved via SOQL without querying the requested field: Name
}

Использование Semi-Join

Выбор всех учетных записей, у которых есть открытые записи возможностей

SELECT Id, Name FROM Account WHERE AccountId IN 
    (SELECT Id FROM Opportunity WHERE IsClosed = false)

Динамический SOQL

Вы можете выполнить запрос базы данных из строки, а не регулярного выражения SOQL:

String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);

Поскольку динамические запросы SOQL не компилируются, их ссылки на схемы не проверяются, поэтому предпочтительнее использовать интерполяцию переменных Apex, используя синтаксис :variable где это возможно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow