Apex Academy
Módulo 3·02·25 min

WHERE, ORDER BY, LIMIT

Filtrar, ordenar y quedarte con los primeros: los tres controles que ya usas en cada informe, ahora dentro de la consulta.

En Admin esLos filtros, la lógica de filtros y el orden de un informe

✓ En esta sub-lección

  1. 01Traducir un filtro de informe (igual a, contiene, empieza por, fecha relativa) a una cláusula WHERE.
  2. 02Combinar condiciones con AND, OR y paréntesis, como la lógica de filtros de un informe.
  3. 03Ordenar con ORDER BY y limitar con LIMIT para traer solo lo que necesitas.

La nutria: ¿Te acuerdas? · Repaso de la lección 1

Tu código lee a.Industry, pero en el SELECT solo pediste Id y Name. ¿Qué pasa?

Una consulta sin filtro es un informe de «todas las cuentas»: útil una vez, peligroso siempre. En una org con 400.000 cuentas, traerlas todas para quedarte con cinco es lento y además choca con los . La regla de oro de SOQL es pedirle a la base de datos exactamente lo que necesitas, y nada más.

La nutria: El paralelo de Admin

Yo lo hacía todo en el informe: añadía filtros (Sector igual a Tecnología, Fecha de cierre este trimestre), escribía la lógica de filtros (1 AND (2 OR 3)), ordenaba por una columna y, si quería, limitaba las filas con «Mostrar las 10 primeras». SOQL tiene exactamente esas cuatro piezas: WHERE, AND/OR con paréntesis, ORDER BY y LIMIT.

WHERE: los filtros

Apex
List<Opportunity> opps = [
    SELECT Id, Name, Amount, StageName
    FROM Opportunity
    WHERE Amount > 50000 AND IsClosed = false
];
Puedes repartir la consulta en varias líneas: Apex la lee igual. Así se leen mejor las consultas largas.
Operador del filtro de informeEn SOQL
igual aIndustry = 'Retail'
distinto deStageName != 'Closed Lost'
mayor que / menor o igualAmount > 50000 · Amount <= 1000
contieneName LIKE '%Global%'
empieza porName LIKE 'Acme%'
igual a (varios valores)Rating IN ('Hot', 'Warm')
el campo está vacíoPhone = null
  • Los textos van entre comillas simples, igual que en Apex. Las comillas dobles no existen en SOQL.
  • En SOQL se compara con un solo =, no con ==. Es un lenguaje distinto dentro de los corchetes.
  • Las comparaciones de texto no distinguen mayúsculas: Industry = 'retail' encuentra 'Retail'. Como el buscador de un informe.
  • En LIKE, % significa «cualquier cosa». '%Global%' es «contiene Global».

AND, OR y paréntesis: la lógica de filtros

Cuando un informe tiene tres filtros, Salesforce los une con AND por defecto; si quieres otra cosa, escribes la lógica de filtros: 1 AND (2 OR 3). En SOQL escribes esa misma lógica con las condiciones en lugar de los números. Y los paréntesis importan igual que allí: sin ellos, AND se evalúa antes que OR, como la multiplicación antes que la suma en el Módulo 1.

Apex
// Lógica de filtros del informe: 1 AND (2 OR 3)
[SELECT Id, Name FROM Account
 WHERE BillingCountry = 'Spain'
   AND (Industry = 'Retail' OR Industry = 'Banking')]

// Lo mismo, más corto, con IN
[SELECT Id, Name FROM Account
 WHERE BillingCountry = 'Spain'
   AND Industry IN ('Retail', 'Banking')]

Fechas relativas: las mismas que en tus informes

En un informe eliges «Fecha de cierre: este trimestre» o «Últimos 30 días» sin escribir ninguna fecha. SOQL tiene los mismos atajos, llamados literales de fecha. Se escriben sin comillas y se recalculan cada vez que se ejecuta la consulta, así que tu código sigue funcionando el año que viene.

En el informeLiteral de fecha SOQL
HoyCloseDate = TODAY
Este trimestreCloseDate = THIS_QUARTER
Últimos 30 díasCreatedDate = LAST_N_DAYS:30
Próximos 7 díasActivityDate = NEXT_N_DAYS:7
Año pasadoCloseDate = LAST_YEAR

ORDER BY y LIMIT

Apex
// Las 10 oportunidades abiertas más grandes de este trimestre
List<Opportunity> top10 = [
    SELECT Id, Name, Amount
    FROM Opportunity
    WHERE IsClosed = false AND CloseDate = THIS_QUARTER
    ORDER BY Amount DESC NULLS LAST
    LIMIT 10
];
El orden de las cláusulas es fijo: SELECT, FROM, WHERE, ORDER BY, LIMIT. Si lo cambias, no compila.
  1. FROM Opportunity12.000 filas

  2. WHERE IsClosed = false AND CloseDate = THIS_QUARTER—

  3. ORDER BY Amount DESC—

  4. LIMIT 10—

Barras en escala logarítmica: de 12.000 a 10 no cabría en una escala normal.

Paso 1 de 4

La org tiene 12.000 oportunidades. Si la consulta terminara aquí, las 12.000 viajarían a tu código… y el límite de filas por transacción es de 50.000: con cuatro consultas así ya estarías rozándolo.

Cada cláusula deja pasar menos registros. Cuanto antes filtres, menos trabajo para todos.

Pruébalo: la consulta y su resultado, en vivo

Abajo tienes una org de Sales Cloud en miniatura (cinco cuentas con sus contactos) y una consulta que puedes montar por piezas. Cambia el filtro, el orden, el límite y los campos: la consulta se reescribe sola y la tabla de resultados se recalcula al instante. Es el Developer Console sin salir de aquí.

Cambia las piezas de la consulta y mira cómo cambian las filas. Los datos son una org pequeña de Sales Cloud: cinco cuentas con sus contactos.

CAMPOSName
[SELECT Id, Name, Industry FROM Account]
NameIndustry
Acme CorpTechnology
Northwind TradingRetail
GlobexTechnology
InitechManufacturing
Umbrella FoodsRetail

5 filas devueltas — Sin WHERE, la consulta trae las cinco cuentas de la org. En una org de verdad eso son todas: por eso el filtro no es un adorno.

Dos cosas que merece la pena probar: poner LIMIT sin ORDER BY (¿qué fila te toca?) y filtrar por 'technology' en minúsculas.
  • ASC ordena de menor a mayor (o A→Z) y es el valor por defecto; DESC, al revés.
  • NULLS LAST manda los vacíos al final. Sin él, en orden ascendente los null salen primero.
  • Sin ORDER BY, el orden no está garantizado: no des por hecho que llegan por fecha de creación.