Buscar..


Sintaxis

  • SELECCIONAR ID DE Cuenta
  • SELECCIONAR ID, Nombre DESDE cuenta
  • SELECCIONE ID DE LA Cuenta DONDE Nombre = 'SomeAccountName'
  • SELECCIONE ID, Nombre, (SELECCIONE ID, Nombre DE Contactos) DESDE Cuenta
  • SELECCIONE ID, nombre DESDE la cuenta DONDE Id =: apexVariableName

Consulta SOQL básica

SELECT Id, Name FROM Account

Esto devolverá los campos Id y Nombre de la tabla de la Cuenta. No se aplicará ningún filtrado o clasificación.

Consulta SOQL Con Filtrado

SELECT Name FROM User WHERE IsActive = true

Esto devolverá el nombre de todos los usuarios activos.

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

Esto devolverá los contactos creados el 1 de enero de 2016 o después.

SELECT Id, Name FROM Account LIMIT 100

Esto devolverá las primeras 100 cuentas de una lista no ordenada.

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

Esto devolverá Leads con un número de teléfono que coincida con el formato especificado. "%" actúa como un carácter comodín.

Usar LIKE '% %' también permite que un desarrollador replique una fórmula CONTAINS( ) .

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

Devolverá los prospectos con una fuente principal que contenga Google, es decir, "AdWords de Google" y "Búsqueda natural de Google".

Consulta de SOQL con pedidos

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

Usando SOQL para construir un mapa

Una característica muy útil que muchas personas pasan por alto es la capacidad de construir un mapa usando una consulta SOQL.

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

Cuando ejecuta este código, las accounts contienen un mapa de los objetos de su cuenta, con la clave de identificación. La salida al registro de depuración se vería similar a esto:

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

Ahora puede buscar los objetos de la Cuenta utilizando su Id. Además, si desea una colección de ID únicas, puede llamar a la función keySet() de la clase Map, así:

System.debug(accounts.keySet());

que se ve algo como esto en el registro de depuración:

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

Esto es muy útil cuando necesita consultar para obtener registros y acceder a ellos repetidamente en su código.

Consulta de SOQL para hacer referencia a los campos del objeto principal

Cuando los objetos están vinculados por una relación de búsqueda o detalle maestro, los campos de registros primarios pueden ser referenciados desde el registro secundario o "objeto base" en una consulta. Esto también se conoce como travesía hacia arriba.

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

Es posible recorrer cinco récords hacia arriba.

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

Cuando el objeto base es un campo de búsqueda personalizado, el __c en el nombre del campo Primary_Influencer__c, por ejemplo, se cambiará a __r.

SELECT Primary_Influencer__r.Nickname__c FROM Contact

Consulta SOQL para obtener registros hijo

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

Consultas SOQL en Apex

Para realizar una consulta en Apex, rodee la consulta entre corchetes. El resultado se puede asignar a una lista, o a un solo objeto.

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

Referencias de variables en las consultas de Apex SOQL

Para hacer referencia a una variable en una consulta, agregue dos puntos (:) antes del nombre 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];

Posibles excepciones en las consultas de Apex SOQL

Cuando se asigna a un solo objeto, una consulta que devuelve algo que no sea una sola fila arrojará una 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
}

Si intenta utilizar un campo que no incluyó en la consulta, se emitirá una 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
}

Usando un Semi-Join

Seleccionar todas las cuentas que tienen registros de oportunidades abiertas debajo de ellas

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

SOQL dinámico

Puede ejecutar una consulta de base de datos desde una cadena en lugar de una expresión SOQL regular:

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

Dado que las consultas dinámicas de SOQL no se compilan, sus referencias de esquema no se validan, por lo que es preferible utilizar la interpolación de variables de Apex utilizando la sintaxis :variable cuando sea posible.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow