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 esta sub-lección
- 01Traducir un filtro de informe (igual a, contiene, empieza por, fecha relativa) a una cláusula WHERE.
- 02Combinar condiciones con AND, OR y paréntesis, como la lógica de filtros de un informe.
- 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
WHERE: los filtros
List<Opportunity> opps = [
SELECT Id, Name, Amount, StageName
FROM Opportunity
WHERE Amount > 50000 AND IsClosed = false
];| Operador del filtro de informe | En SOQL |
|---|---|
| igual a | Industry = 'Retail' |
| distinto de | StageName != 'Closed Lost' |
| mayor que / menor o igual | Amount > 50000 · Amount <= 1000 |
| contiene | Name LIKE '%Global%' |
| empieza por | Name LIKE 'Acme%' |
| igual a (varios valores) | Rating IN ('Hot', 'Warm') |
| el campo está vacío | Phone = 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.
// 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 informe | Literal de fecha SOQL |
|---|---|
| Hoy | CloseDate = TODAY |
| Este trimestre | CloseDate = THIS_QUARTER |
| Últimos 30 días | CreatedDate = LAST_N_DAYS:30 |
| Próximos 7 días | ActivityDate = NEXT_N_DAYS:7 |
| Año pasado | CloseDate = LAST_YEAR |
ORDER BY y LIMIT
// 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
];FROM Opportunity12.000 filasWHERE IsClosed = false AND CloseDate = THIS_QUARTER—ORDER BY Amount DESC—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.
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.
[SELECT Id, Name, Industry FROM Account]| Name | Industry |
|---|---|
| Acme Corp | Technology |
| Northwind Trading | Retail |
| Globex | Technology |
| Initech | Manufacturing |
| Umbrella Foods | Retail |
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.
- 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.