Salesforce
Salesforce Object Query Language (SOQL)
Suche…
Syntax
- ID von Konto auswählen
- SELECT ID, Name FROM Konto
- SELECT ID FROM Konto WHERE Name = 'SomeAccountName'
- SELECT ID, Name, (SELECT ID, Name FROM Kontakte) FROM Konto
- SELECT ID, Name FROM Konto WHERE Id =: apexVariableName
Grundlegende SOQL-Abfrage
SELECT Id, Name FROM Account
Dadurch werden die Felder ID und Name aus der Account-Tabelle zurückgegeben. Es wird keine Filterung oder Sortierung angewendet.
SOQL-Abfrage mit Filterung
SELECT Name FROM User WHERE IsActive = true
Dies gibt den Namen aller aktiven Benutzer zurück.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Dadurch werden Kontakte zurückgegeben, die am oder nach dem 1. Januar 2016 erstellt wurden.
SELECT Id, Name FROM Account LIMIT 100
Dadurch werden die ersten 100 Konten aus einer ungeordneten Liste zurückgegeben.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Dadurch werden Leads mit einer Telefonnummer zurückgegeben, die dem angegebenen Format entspricht. "%" fungiert als Platzhalter.
Die Verwendung von LIKE '% %'
CONTAINS( )
LIKE '% %'
ermöglicht es einem Entwickler auch, eine CONTAINS( )
Formel zu replizieren.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Gibt Leads mit einer Lead-Quelle zurück, die Google enthält, z. B. "Google AdWords" und "Google Natural Search".
SOQL-Abfrage mit Bestellung
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
Verwenden von SOQL zum Erstellen einer Karte
Eine sehr nützliche Funktion, die viele Leute übersehen, ist die Möglichkeit, eine Map mit einer SOQL-Abfrage zu erstellen.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
Wenn Sie diesen Code ausführen, accounts
enthält dann eine Karte von Ihrem Konto Objekte, verkeilt auf Id. Die Ausgabe in das Debug-Protokoll würde folgendermaßen aussehen:
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},
...
}
Sie können nun die Account-Objekte anhand ihrer ID suchen. Wenn Sie eine Sammlung eindeutiger IDs wünschen, können Sie außerdem die keySet()
Funktion der Map-Klasse aufrufen:
System.debug(accounts.keySet());
was im Debug-Log ungefähr so aussieht:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Dies ist sehr nützlich, wenn Sie abfragen müssen, um Datensätze abzurufen und wiederholt in Ihrem Code darauf zuzugreifen.
SOQL-Abfrage zum Verweisen auf Felder des übergeordneten Objekts
Wenn Objekte durch eine Lookup- oder Master-Detail-Beziehung verknüpft sind, können die Felder des übergeordneten Datensatzes aus dem untergeordneten Datensatz oder dem 'Basisobjekt' in einer Abfrage referenziert werden. Dies wird auch als Aufwärtsdurchquerung bezeichnet.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Es ist möglich, fünf Datensätze nach oben zu durchlaufen.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
Wenn das Basisobjekt ein benutzerdefiniertes Suchfeld ist, wird beispielsweise der Name __c im Feld Primary_Influencer__c in __r geändert.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
SOQL-Abfrage, um untergeordnete Datensätze abzurufen
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
SOQL-Abfragen in Apex
Um eine Abfrage in Apex auszuführen, umgeben Sie die Abfrage mit eckigen Klammern. Das Ergebnis kann einer Liste oder einem einzelnen Objekt zugeordnet werden.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Variablenreferenzen in Apex-SOQL-Abfragen
Um auf eine Variable in einer Abfrage zu verweisen, fügen Sie vor dem Variablennamen einen Doppelpunkt (:)
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];
Mögliche Ausnahmen in Apex-SOQL-Abfragen
Beim Zuordnen zu einem einzelnen Objekt QueryException
eine Abfrage, die etwas anderes als eine einzelne Zeile QueryException
, eine 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
Sie versuchen, ein Feld zu verwenden, das Sie nicht in die Abfrage aufgenommen haben, wird eine 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
}
Verwenden eines Semi-Joins
Alle Konten auswählen, unter denen offene Opportunity-Datensätze liegen
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
Dynamisches SOQL
Sie können eine Datenbankabfrage aus einem String anstelle eines regulären SOQL-Ausdrucks ausführen:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Da dynamische SOQL-Abfragen nicht kompiliert werden, werden ihre Schemabezüge nicht validiert. Daher ist es bevorzugt, die Apex-Variableninterpolation mit der :variable
sofern möglich.