Szukaj…


Składnia

  • WYBIERZ Id z konta
  • WYBIERZ Identyfikator, nazwa z konta
  • WYBIERZ ID Z konta GDZIE Nazwa = 'SomeAccountName'
  • WYBIERZ Id, Nazwa, (WYBÓR Id, Imię Z Kontaktów) Z konta
  • WYBIERZ Id, Nazwa Z Konta GDZIE Id =: apexVariableName

Podstawowe zapytanie SOQL

SELECT Id, Name FROM Account

Spowoduje to zwrócenie pól Id i Nazwa z tabeli Konta. Nie będzie stosowane żadne filtrowanie ani sortowanie.

Zapytanie SOQL z filtrowaniem

SELECT Name FROM User WHERE IsActive = true

Spowoduje to zwrócenie nazwy wszystkich aktywnych użytkowników.

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

Spowoduje to zwrócenie Kontaktów utworzonych 1 stycznia 2016 r. Lub później.

SELECT Id, Name FROM Account LIMIT 100

Spowoduje to zwrócenie pierwszych 100 kont z nieuporządkowanej listy.

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

Zwróci to odprowadzenie z numerem telefonu pasującym do określonego formatu. „%” działa jak postać wieloznaczna.

Użycie LIKE '% %' umożliwia także programistom replikację formuły CONTAINS( ) .

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

Zwróci Leady ze źródłem ołowiu zawierającym Google, tj. „Google AdWords” i „Google Natural Search”.

Zapytanie SOQL z zamówieniem

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

Używanie SOQL do budowy mapy

Bardzo przydatną funkcją, którą wielu ludzi przeoczy, jest możliwość zbudowania mapy za pomocą zapytania SOQL.

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

Po uruchomieniu tego kodu accounts zawierają mapę obiektów konta wpisaną w Id. Dane wyjściowe do dziennika debugowania wyglądałyby podobnie do tego:

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

Możesz teraz wyszukiwać obiekty konta przy użyciu ich identyfikatora. Ponadto, jeśli chcesz mieć kolekcję unikalnych identyfikatorów, możesz wywołać funkcję keySet() klasy Map, na przykład:

System.debug(accounts.keySet());

który wygląda mniej więcej tak w dzienniku debugowania:

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

Jest to bardzo przydatne, gdy trzeba wykonać zapytanie, aby uzyskać rekordy i uzyskać do nich dostęp wielokrotnie w kodzie.

Zapytanie SOQL do odwołania do pól obiektu nadrzędnego

Gdy obiekty są połączone przez wyszukiwanie lub relację wzorca-szczegółów, do pola rekordów nadrzędnych można odwoływać się z rekordu podrzędnego lub „obiektu podstawowego” w zapytaniu. Jest to również znane jako przejście w górę.

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

Możliwe jest przejście o pięć rekordów w górę.

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

Gdy obiektem podstawowym jest niestandardowe pole wyszukiwania, na przykład __c w nazwie pola Primary_Influencer__c zostanie na przykład zmienione na __r.

SELECT Primary_Influencer__r.Nickname__c FROM Contact

Zapytanie SOQL, aby uzyskać rekordy potomne

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

Zapytania SOQL w apeksie

Aby wykonać zapytanie w wierzchołku, otocz je nawiasami kwadratowymi. Wynik można przypisać do listy lub do pojedynczego obiektu.

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

Odwołania do zmiennych w zapytaniach Apex SOQL

Aby odwołać się do zmiennej w zapytaniu, dodaj dwukropek (:) przed nazwą zmiennej.

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

Potencjalne wyjątki w zapytaniach Apex SOQL

Podczas przypisywania do pojedynczego obiektu zapytanie zwracające cokolwiek innego niż pojedynczy wiersz spowoduje 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
}

Próba użycia pola, którego nie uwzględniono w zapytaniu spowoduje 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
}

Korzystanie z połączenia częściowego

Wybieranie wszystkich kont, które mają otwarte rekordy możliwości pod nimi

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

Dynamiczny SOQL

Możesz wykonać zapytanie do bazy danych na podstawie ciągu znaków zamiast zwykłego wyrażenia SOQL:

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

Ponieważ dynamiczne zapytania SOQL nie są kompilowane, ich odwołania do schematów nie są sprawdzane, dlatego lepiej jest używać interpolacji zmiennych Apex przy użyciu, gdzie to możliwe, składni :variable .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow