Recherche…


Syntaxe

  • SELECT ID FROM Compte
  • Identifiant SELECT, Nom du compte
  • SELECT ID FROM Compte WHERE Name = 'SomeAccountName'
  • SELECT ID, Nom, (ID SELECT, Nom FROM Contacts) FROM Compte
  • SELECT ID, Nom FROM Compte WHERE Id =: apexVariableName

Requête SOQL de base

SELECT Id, Name FROM Account

Cela retournera les champs Id et Name de la table Account. Aucun filtrage ou tri ne sera appliqué.

Requête SOQL avec filtrage

SELECT Name FROM User WHERE IsActive = true

Cela renverra le nom de tous les utilisateurs actifs.

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

Cela renverra les contacts créés à partir du 1er janvier 2016.

SELECT Id, Name FROM Account LIMIT 100

Cela renverra les 100 premiers comptes d'une liste non ordonnée.

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

Cela renverra des pistes avec un numéro de téléphone correspondant au format spécifié. "%" agit comme un caractère générique.

L'utilisation de LIKE '% %' permet également à un développeur de répliquer une formule CONTAINS( ) .

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

Renvoie les prospects avec une source principale contenant Google, c'est-à-dire "Google AdWords" et "Google Natural Search".

Requête SOQL avec commande

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

Utiliser SOQL pour construire une carte

Une fonctionnalité très utile que beaucoup de gens ignorent est la possibilité de construire une carte en utilisant une requête SOQL.

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

Lorsque vous exécutez ce code, le accounts contient alors une carte des objets de votre compte, indexés sur l'ID. La sortie du journal de débogage ressemblerait à ceci:

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}, 
    ...
}

Vous pouvez maintenant rechercher les objets Compte en utilisant leur identifiant. De plus, si vous voulez une collection d'ID uniques, vous pouvez appeler la fonction keySet() de la classe Map, comme ceci:

System.debug(accounts.keySet());

qui ressemble à ceci dans le journal de débogage:

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

Ceci est très utile lorsque vous avez besoin d'interroger pour obtenir des enregistrements et d'y accéder de manière répétée dans votre code.

Requête SOQL pour référencer les champs de l'objet parent

Lorsque les objets sont liés par une relation de référence ou de référence, les champs des enregistrements parents peuvent être référencés à partir de l'enregistrement enfant ou de l'objet de base dans une requête. Ceci est également connu sous le nom de traversée vers le haut.

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

Il est possible de parcourir cinq enregistrements vers le haut.

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

Lorsque l'objet de base est un champ de recherche personnalisé, le nom du champ ___ dans Primary_Influencer__c, par exemple, sera remplacé par __r.

SELECT Primary_Influencer__r.Nickname__c FROM Contact

Requête SOQL pour obtenir des enregistrements enfants

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

Requêtes SOQL dans Apex

Pour effectuer une requête dans Apex, entourez la requête avec des crochets. Le résultat peut être affecté à une liste ou à un objet unique.

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

Références variables dans les requêtes SOQL Apex

Pour référencer une variable dans une requête, ajoutez un deux-points (:) avant le nom de la variable.

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

Exceptions potentielles dans les requêtes SOQL Apex

Lors de l'attribution à un objet unique, une requête qui renvoie autre chose qu'une ligne unique QueryException une 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
}

Tenter d'utiliser un champ que vous n'avez pas inclus dans la requête lancera une 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
}

Utiliser une semi-jointure

Sélection de tous les comptes qui ont des enregistrements d'opportunité ouverts sous eux

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

SOQL dynamique

Vous pouvez exécuter une requête de base de données à partir d'une chaîne plutôt qu'une expression SOQL standard:

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

Comme les requêtes SOQL dynamiques ne sont pas compilées, leurs références de schéma ne sont pas validées. Il est donc préférable d'utiliser l'interpolation de variables Apex en utilisant la syntaxe :variable si possible.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow