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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow