Manual de campo · trampas de SQL
LIKE compara carácter por carácter y distingue mayúsculas de minúsculas. Si el dato real viene en mayúsculas, en minúsculas o sin acentos, un patrón bien escrito no encuentra filas que están justo delante.
Búsquedas de texto libre sobre nombres, direcciones o cualquier campo que la gente escribe a mano: mayúsculas, minúsculas y acentos nunca son consistentes entre sistemas.
Mal: LIKE distingue mayúsculas
SELECT *
FROM huespedes
WHERE nombre LIKE '%Vela%';
-- el recepcionista dice que Vela durmió 3 noches; esto sólo encuentra 1:
-- 'VELA, ANDRES' y 'vela andres' no coinciden con '%Vela%'
Bien: ILIKE, sin distinguir mayúsculas
SELECT *
FROM huespedes
WHERE nombre ILIKE '%vela%';
LIKE es sensible a mayúsculas en DuckDB (como en la mayoría de motores, salvo que la columna use una collation especial): 'VELA, ANDRES' LIKE '%Vela%' es falso, letra por letra, no una aproximación. ILIKE hace la misma comparación ignorando mayúsculas y minúsculas. Queda un problema hermano que ILIKE no arregla: los acentos. 'andres' ILIKE '%andrés%' también es falso, porque a la base le importa la tilde tanto como la mayúscula; para eso hace falta normalizar los dos lados con strip_accents() antes de comparar. Ninguno de los dos motores avisa cuando el patrón no encuentra nada: cero filas se lee como 'no hay nadie', no como 'busqué mal'.
El juego está lleno de trampas como esta, escondidas en casos con datos de verdad.
Jugar el caso 1 gratis →