Vamos a considerar algunas de las posibles entradas:
John
Smith
John Smith
Su consulta inicial de la muestra es:
SELECT * FROM people
WHERE
firstname LIKE '%user_submitted_data%' OR
lastname LIKE '%user_submitted_data%'
Ahora, cuando el usuario entra en la primera entrada , esta consulta seleccionará a todas las personas cuyo primer nombre contenga 'John'; también seleccionará a todas las personas cuyo apellido contenga 'John' (por ejemplo, todos los Johnsons en la base de datos). Del mismo modo, la segunda entrada elegirá a todas las personas cuyo primer nombre contenga 'Smith'; también seleccionará a todas las personas cuyo apellido contenga 'Smith' (por ejemplo, Smithsons y Smithers). Hasta aquí todo bien; no es perfecto debido a problemas de sensibilidad a mayúsculas y minúsculas (a partir de ahora ignoraré la distinción entre mayúsculas y minúsculas, pero probablemente no deberías ignorarla), pero estará bien.
La tercera entrada solo seleccionará las personas cuyo primer nombre contenga 'John Smith'; también seleccionará a las personas cuyo apellido contenga 'John Smith'. Sin embargo, es bastante probable que haya muy pocas personas que cumplan con esos criterios: las personas llamadas John Smith tendrán solo a John en el primer nombre y solo a Smith en el apellido. Es poco probable que sea lo que tenía en mente.
No está claro si tiene una columna llamada 'nombre completo' en la tabla. Si lo hace, puede hacer coincidir esa columna en lugar de coincidir con el nombre y apellido por separado. Si no lo hace, tal vez pueda fabricar dicha columna y luego ejecutar la consulta en contra de eso.
SELECT *
FROM (SELECT firstname || ' ' || lastname AS fullname, ... FROM people) AS t
WHERE t.fullname LIKE '%user_submitted_data%'
Esto funciona bastante bien.
Sin embargo, si le preocupan nombres como 'Charles De Gaulle' (o 'Charles de Gaulle') o 'Michael van den Berg'), la correspondencia fallará si alguien ingresa 'Charles Gaulle' o ' Michael Berg, y mucho menos Michael Vandenberg. Probablemente necesites reemplazar cualquier carácter de espacio en la entrada del usuario con un símbolo '%' también. Incluso entonces, enfrenta el problema de que las palabras deben aparecer exactamente en la secuencia dada por el usuario, lo que puede no importar, pero debe decidir conscientemente que no importa. Por ejemplo, si la entrada es 'Adam John Smith', entonces la consulta no captará 'John Adam Smith'; si la entrada es 'Smith, John', entonces no contestará a nadie (lo más probable).
Si desea administrar esto, es probable que deba tokenizar la entrada del usuario y buscar en las palabras separadas.Tenga cuidado de que alguien pregunte por una palabra secundaria (por ejemplo, alguien pregunta sobre 'de' como palabra de nombre): ninguna de las consultas en este momento asegura que las palabras de entrada del usuario coincidan con palabras completas en los valores (John vs Johnson), y hacerlo con el operador LIKE estándar de SQL es casi imposible.
Gracias, lo arregla. – Jimmy