2010-06-01 8 views
1

j'ai une base de données avec des noms comme celui-ci:Question sur l'article SQL

Maria Garcia Garralon 
Jose Maria Perez Gutierrez 

J'ai un filtre aussi pour rechercher les noms. Imaginez l'écriture de l'utilisateur dans le filtre

maria Garralon

(le premier et les derniers mots)

Dans ce cas, est-il une clause SQL qui trouve le dossier « Maria Garcia Garralon "?

Cordialement

Javi

Répondre

2

Vous pouvez diviser vos termes de recherche et effectuer des clauses LIKE multiplicatives. Tels que:

WHERE 
    Field LIKE '%maria%' 
AND 
    Field LIKE '%garralon%' 

Alternativement, si vous pouvez être sûr de l'ordre des espaces termes de recherche entre les services de navigation aérienne, alors vous pouvez toujours faire quelque chose comme ça.

WHERE 
    Field LIKE REPLACE('maria garralon', ' ', '%') 
+0

Quand vous faites ce genre de requête, vous pouvez ancrer le début/fin de chaque mot avec des espaces, par exemple 'lower (« « || champ || » ») COMME '% maria%' '. Sinon, vous pouvez trouver des "matches" surprenants comme "Fred Martin" correspondant à "Winifred Martinez". –

0

Je suppose que vous auriez besoin de comparer deux fois:

(pseudo syntaxe) WHERE nom LIKE '% Maria%' AND nom LIKE '% Garralon%'

1

Oui, vous pouvez utiliser un segment de requête non évolutive hideuse le long des lignes de:

where upper(name) like 'MARIA % GARRALON' 

ou vous pouvez le faire de la bonne façon :-)

Introduire une autre colonne comme first_and_last_name et utilisez un déclencheur d'insertion/mise à jour pour le remplir avec la valeur correcte maria garralon. Ensuite index cette colonne et vos requêtes seront aveuglante rapide:

where first_and_last_name = 'maria garralon' 

qui déplace le coût du calcul à l'insertion/mise à jour où il appartient, au lieu de la sélection où les frais sont engagés inutilement. Les données ne changent que lors de l'insertion/mise à jour, c'est donc le seulement fois que vous devriez avoir besoin d'engager ce coût.

Si vos besoins sont plus compliqués qu'un simple nom et prénom, vous pouvez remplir d'autres tables dans vos déclencheurs.

0

Would quelque chose comme:

select * from <TABLE> 
where <FIELD> like '%'+REPLACE(<NAME>,' ',' % ')+'%'