Salesforce
Salesforce Object Query Language (SOQL)
Sök…
Syntax
- VÄLJ ID från konto
- VÄLJ ID, namn från konto
- VÄLJ ID från konto VAR Namn = 'SomeAccountName'
- VÄLJ ID, namn, (VÄLJ ID, namn från kontakter) FRÅN konto
- VÄLJ ID, namn FRÅN kontot VAR Id =: apexVariableName
Grundläggande SOQL-fråga
SELECT Id, Name FROM Account
Detta returnerar fältet Id och namn från kontotabellen. Ingen filtrering eller sortering kommer att tillämpas.
SOQL-fråga med filtrering
SELECT Name FROM User WHERE IsActive = true
Detta returnerar namnet på alla aktiva användare.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
Detta returnerar kontakter som skapats den 1 januari 2016 eller senare.
SELECT Id, Name FROM Account LIMIT 100
Detta kommer att returnera de första 100 kontona från en oordnad lista.
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
Detta returnerar Leads med ett telefonnummer som matchar det angivna formatet. "%" fungerar som ett jokertecken.
Att använda LIKE '% %'
också möjligt för en utvecklare att replikera en CONTAINS( )
.
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Kommer att returnera Leads med en leadkälla som innehåller Google, dvs 'Google AdWords' och 'Google Natural Search'.
SOQL-fråga med beställning
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
Använda SOQL för att konstruera en karta
En mycket användbar funktion som många förbiser är möjligheten att konstruera en karta med en SOQL-fråga.
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
När du kör den här koden innehåller accounts
sedan en karta över dina kontoobjekt som är inmatade på ID. Utgången till felsökningsloggen ser ut så här:
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},
...
}
Du kan nu leta upp kontobjekten med deras ID. Om du vill ha en samling unika ID kan du dessutom ringa keySet()
i keySet()
så här:
System.debug(accounts.keySet());
som ser ut så här i felsökningsloggen:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
Detta är mycket användbart när du behöver fråga för att få poster och få åtkomst till dem upprepade gånger i din kod.
SOQL-fråga till fält för referensföräldraobjekt
När objekt är länkade genom en uppslagning eller master-detalj-förhållande, kan fältet för överordnade poster refereras från underordnandet eller "basobjektet" i en fråga. Detta är också känt som uppåtgående korsning.
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
Det är möjligt att korsa fem poster uppåt.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
När basobjektet är ett anpassat uppslagningsfält ändras till exempel __c i fältets namn Primär_Influencer__c till __r.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
SOQL-fråga för att få barnrekord
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
SOQL-frågor i Apex
Om du vill utföra en fråga i Apex, omger du frågan med fyrkantiga parenteser. Resultatet kan tilldelas till en lista eller till ett enda objekt.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Variabla referenser i Apex SOQL-frågor
För att referera till en variabel i en fråga, lägg till en kolon (:) före variabelns namn.
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];
Potentiella undantag i Apex SOQL-frågor
När du tilldelar ett enda objekt kommer en fråga som returnerar allt annat än en enda rad att kasta en 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
}
Att försöka använda ett fält som du inte inkluderade i frågan kommer att kasta en 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
}
Använda en Semi-Join
Välja alla konton som har öppna möjlighetsposter under dem
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
Dynamisk SOQL
Du kan köra en databasfråga från en sträng snarare än ett vanligt SOQL-uttryck:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
Eftersom dynamiska SOQL-frågor inte sammanställs, valideras inte deras schematreferenser, så det är att föredra att använda Apex-variabel interpolering med hjälp av :variable
syntax där det är möjligt.