Pregunta MySQL: ¿Qué es una versión inversa de LIKE?


ME GUSTA El operador en MySql se usa para buscar filas que contengan nuestro texto de consulta, por ejemplo:

select name from user where name like "%john%"

que regresará John Smith, Peter Johnson etc.

¿Qué sucede si necesito lo contrario? Para encontrar filas que son CONTENIDO en nuestro texto de consulta? Por ejemplo, lo doy John Smith and Peter Johnson are best friends y quiero que encuentre todos los nombres de la tabla que se pueden encontrar en esta cadena.

¿Como hacer eso?


32
2018-01-23 06:23


origen


Respuestas:


Aquí hay una manera de lograr lo que describes:

SELECT name FROM user 
WHERE 'John Smith and Peter Johnson are best friends' LIKE
  CONCAT('%', name, '%')

46
2018-01-23 06:58



select name
from users
where instr('John Smith and Peter Johnson', name) > 0

Prefiero usar este método en lugar de:

select *
from users
WHERE  'John Smith and Peter Johnson' LIKE CONCAT('%', name ,'%')

porque si hay alguna posibilidad de que el name podría contener el % o _ carácter (por ejemplo, name = 'v% alue'), entonces la consulta anterior aún devolvería ese registro incorrectamente. También tenga en cuenta que si su columna puede contener barras invertidas y / o "Personajes de escape C"entonces también deberían escaparse. Todo esto se explica en MySQL String Comparison Functions. Por ejemplo, el siguiente SQL devolvería 1:

SELECT 'val\%ue' LIKE CONCAT('%', 'al\\\\\%u' ,'%');

La barra invertida necesita ser escapada con \\\\ y el % personaje fue escapado: \%.


1
2018-03-24 04:00



Este es un problema de indexación de texto. Si lo hago bien, su tarea es encontrar todas las referencias a personas en un texto de forma libre, y no tiene nada que ver con LIKE o NOT LIKE.

En una forma general, la tabla de la base de datos con la que busca referencias actúa como diccionario de algún algoritmo de indexación de texto. Construya un índice en la cadena de entrada usando este diccionario y con suerte obtendrá algunas coincidencias.


-2
2018-01-23 06:55