7

Estoy buscando un patrón para realizar una búsqueda dinámica en varias tablas.Necesita patrón para la búsqueda dinámica de varias tablas sql

No tengo control sobre la estructura de la tabla de la base de datos heredada (y mal diseñada).

Considere un escenario similar a un currículum vitae en el que un usuario desee realizar una búsqueda en contra de cualquiera de los datos en el currículum y obtener una lista de currículos que coincidan con sus criterios de búsqueda. Se puede buscar cualquier campo en cualquier momento y en combinación con uno o más campos.

La consulta de sql real se crea dinámicamente según los campos en los que se busca. La mayoría de las soluciones que he encontrado implican complicados bloques, pero no puedo evitar pensar que debe haber una solución más elegante ya que este debe ser un problema resuelto.


Sí, así que comencé a construir dinámicamente el sql en el código. Parece travieso. Si realmente intento apoyar la capacidad solicitada para consultar cualquier combinación de cualquier campo en cualquier tabla, este va a ser un conjunto MASIVO de sentencias if. escalofrío


Creo que leí que se unen sólo funciona si los datos no contiene valores nulos. ¿Es eso correcto? Si es así, no vayas, ya que tengo valores NULOS por todos lados.

Respuesta

5

Por lo que yo entiendo (y también soy alguien que ha escrito en contra de una horrible base de datos heredada), no existe tal cosa como las cláusulas WHERE dinámicas. NO ha sido resuelto.

Personalmente, prefiero generar mis búsquedas dinámicas en el código. Hace las pruebas convenientes. Tenga en cuenta que cuando crea sus consultas SQL en código, no concatenar en la entrada del usuario. Usa tus @variables!

La única alternativa es usar el operador COALESCE. Supongamos que tiene la siguiente tabla:

Users 
----------- 
Name nvarchar(20) 
Nickname nvarchar(10) 

y desea buscar de manera opcional el nombre o apodo. La siguiente consulta hará esto:

SELECT Name, Nickname 
FROM Users 
WHERE 
    Name = COALESCE(@name, Name) AND 
    Nickname = COALESCE(@nick, Nickname) 

Si no desea buscar algo, sólo tiene que pasar en un nulo. Por ejemplo, pasando en "Brian" para @Name y nulo para resultados @ Nick en la siguiente consulta siendo evaluado:

SELECT Name, Nickname 
FROM Users 
WHERE 
    Name = 'brian' AND 
    Nickname = Nickname 

El operador coalesce gira la nulo en una evaluación identidad, que es siempre verdad y no lo hace afectar la cláusula where.

1

La búsqueda y la normalización pueden estar en desacuerdo entre sí. Probablemente, lo primero sería obtener algún tipo de "vista" que muestre todos los campos que se pueden buscar como una sola fila con una sola clave, obteniendo el currículum. luego puedes lanzar algo como Lucene al frente de eso para darte un índice de texto completo de esas filas, de la manera que funciona, pides una "x" en esta vista y te devuelve la clave. Es una gran solución y viene recomendado por el mismo Joel en el podcast dentro de los primeros 2 meses IIRC.

1

Lo que necesita es algo como SphinxSearch (para MySQL) o Apache Lucene.

Como usted ha dicho en su ejemplo imaginemos un curriculum vitae que se compone de varios campos:

  • elemento de la lista
  • Nombre,
  • Adreess,
  • Educación (esto podría ser una tabla de su propia) o
  • Experiencia laboral (esto podría crecer hasta su propia tabla donde cada fila representa un trabajo anterior)

Por lo tanto, buscar una palabra en todos esos campos con WHERE se convierte rápidamente en una consulta muy larga con varias UNIDAS.

En lugar de eso, podría cambiar su marco de referencia y pensar en el currículum completo como lo que es un documento único y solo desea buscar dicho documento.

Aquí es donde hacen herramientas como Sphinx Search. Crean un índice de TEXTO COMPLETO de su 'documento' y luego pueden consultar sphinx y le devolverán el lugar en el que se encontró ese registro en la base de datos.

Muy buenos resultados de búsqueda.

No se preocupe porque estas herramientas no forman parte de su RDBMS, le ahorrará muchos dolores de cabeza utilizar el modelo apropiado de "Documentos" frente a la incorrecta "TABLAS" para esta aplicación.

Cuestiones relacionadas