INSTR

La función INSTR devuelve la posición de la primera aparición de una subcadena dentro de otra cadena, o 0 si no la encuentra. Es la forma más directa de localizar un texto, y resulta muy cómoda cuando, además de saber si una cadena contiene a otra, necesitas el punto exacto donde empieza para luego extraer una porción con SUBSTRING.

INSTR es muy similar a LOCATE, pero con dos diferencias que conviene tener claras desde el principio: el orden de sus argumentos está invertido respecto a LOCATE, e INSTR no admite indicar una posición de inicio. En este artículo veremos su sintaxis, cómo se comporta cuando no encuentra el texto, sus usos típicos con datos reales y la comparación con LOCATE para elegir la adecuada en cada caso.

Sintaxis

INSTR recibe primero la cadena donde buscar y después la subcadena a localizar. Las posiciones que devuelve empiezan en 1, no en 0.

INSTR(cadena, subcadena)

Ejemplo básico

En su uso normal, devuelve la posición donde comienza la subcadena. Aquí 'Tutorial' empieza en el séptimo carácter:

SELECT INSTR('MySQL Tutorial', 'Tutorial') AS posicion;
posicion
7

Cuando la subcadena no existe, el resultado es 0. Este valor permite usar INSTR directamente como condición de "contiene o no contiene":

SELECT INSTR('MySQL Tutorial', 'Python') AS posicion;
posicion
0

Buscar en datos de productos

Como INSTR devuelve 0 cuando no hay coincidencia, filtrar por un valor mayor que cero selecciona las filas que contienen el texto, y de paso obtienes la posición. Es una alternativa a LIKE cuando esa posición te interesa:

SELECT nombre, INSTR(nombre, 'Pro') AS posicion_pro
FROM productos
WHERE INSTR(nombre, 'Pro') > 0;
nombreposicion_pro
iPhone 15 Pro11
AirPods Pro9

Encontrar la arroba en emails

Un caso muy frecuente es localizar el carácter @ de un email, paso previo para separar el usuario del dominio. INSTR da la posición exacta de la arroba en cada dirección:

SELECT
    email,
    INSTR(email, '@') AS pos_arroba
FROM clientes
LIMIT 5;
emailpos_arroba
maria.garcia@email.com13
carlos.rodriguez@email.com17
laura.lopez@email.com12
pedro.fernandez@email.com16
ana.martinez@email.com13

Combinar con SUBSTRING

Aquí INSTR despliega su mayor utilidad. Usando la posición que devuelve como punto de corte para SUBSTRING, se puede dividir un email en usuario y dominio sin conocer de antemano dónde está la arroba: el usuario es todo lo anterior a ella y el dominio todo lo posterior:

SELECT
    email,
    SUBSTRING(email, 1, INSTR(email, '@') - 1) AS usuario,
    SUBSTRING(email, INSTR(email, '@') + 1) AS dominio
FROM clientes
LIMIT 3;
emailusuariodominio
maria.garcia@email.commaria.garciaemail.com
carlos.rodriguez@email.comcarlos.rodriguezemail.com
laura.lopez@email.comlaura.lopezemail.com

Sensibilidad a mayúsculas

Un punto que sorprende es que INSTR no decide por sí misma si distingue mayúsculas: lo hereda de la colación. Con las colaciones _ci por defecto de MySQL, la búsqueda es insensible al caso, de modo que buscar 'mysql' encuentra 'MySQL':

SELECT INSTR('MySQL Tutorial', 'mysql') AS posicion;
posicion
1

Si necesitas una búsqueda sensible a mayúsculas, debes forzarla aplicando el operador BINARY a la cadena, o usar una colación sensible al caso.

INSTR vs LOCATE

Ambas funciones localizan una subcadena, pero conviene saber cuándo usar cada una. La diferencia más peligrosa es el orden de los argumentos, que está invertido entre ellas:

CaracterísticaINSTRLOCATE
Orden de argumentosINSTR(cadena, buscar)LOCATE(buscar, cadena)
Posición inicialNo soportaTercer argumento opcional
FuncionalidadBásicaPermite buscar desde posición N

En resumen: para una búsqueda simple de la primera aparición, INSTR es perfecta y muy legible; en cuanto necesites empezar a buscar desde una posición concreta (por ejemplo, para encontrar la segunda aparición), LOCATE es la única de las dos que lo permite.

Errores comunes

El error más habitual, con diferencia, es confundir el orden de los argumentos al alternar entre INSTR y LOCATE. Como escribir los argumentos al revés no genera ningún error de sintaxis (simplemente busca lo contrario de lo que querías), el fallo pasa desapercibido y devuelve resultados incorrectos. Conviene fijar la regla: en INSTR va primero la cadena grande; en LOCATE, primero lo que buscas.

El segundo descuido es olvidar que las posiciones empiezan en 1. Al combinar INSTR con SUBSTRING, quien viene de lenguajes con índices basados en 0 tiende a equivocarse en uno al calcular las posiciones de corte.

Cuándo usar INSTR

INSTR es la elección natural cuando quieres la posición de la primera aparición de un texto y te resulta cómoda su lectura de izquierda a derecha (cadena, luego lo buscado). Si solo te interesa saber si una cadena contiene a otra sin importar dónde, LIKE suele ser más expresivo; y si necesitas buscar a partir de una posición determinada, recurre a LOCATE.

En el siguiente artículo veremos LOCATE, que ofrece esa flexibilidad adicional de empezar la búsqueda en una posición concreta.

Escrito por Eduardo Lázaro