Tema SQL
FIELD() (MySQL / MariaDB)
Devuelve la posición (1-based) en la que el primer argumento coincide con uno de los siguientes argumentos; 0 si no hay coincidencia. Sirve para ordenar filas según un orden arbitrario de valores.
Descripción
FIELD(valor, v1, v2, v3, …) compara el primer argumento con cada uno de los restantes en orden y devuelve el índice de la primera igualdad. Es frecuente en ORDER BY FIELD(estado, 'pendiente', 'enviado', 'cerrado') para imponer un orden distinto al alfabético. Los argumentos se evalúan como cadenas según contexto; mezclar tipos puede dar conversiones implícitas. No es portable; en otros motores se replica con CASE WHEN estado='pendiente' THEN 1 WHEN … END en ORDER BY. Para listas largas de valores, mantener el orden en una tabla de referencia suele ser más limpio.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
FIELD(valor, valor1 [, valor2 ...])
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Índice 1-based
- Coincide con la convención de FIND_IN_SET, no con índices 0-based de otros lenguajes.
- ORDER BY
- Patrón habitual para prioridades de negocio en listados.
- Sin coincidencia
- Devuelve 0; ORDER BY puede colocar esas filas al inicio o al final según ASC/DESC.
Ejemplos
Ejemplo 1
SELECT FIELD('b', 'a', 'b', 'c') AS pos;
-- pos = 2
SELECT * FROM pedidos
ORDER BY FIELD(estado, 'urgente', 'normal', 'baja'), creado_en DESC;
Ejemplo 2
SELECT * FROM tareas
ORDER BY FIELD(prioridad, 'critica', 'alta', 'media', 'baja'), id;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.