2011-11-22 4 views
1

Je souhaite pouvoir rechercher et renvoyer des résultats sur la plupart des colonnes d'une table mysql. J'ai envisagé d'utiliser un myisam db et une recherche en texte intégral, mais j'ai décidé qu'en raison de la performance, il serait préférable de rester avec innodb. J'ai aussi brièvement envisagé d'utiliser quelque chose comme Solr, mais une solution comme celle-là semble être trop lourde dans ma situation. J'essaie simplement d'ajouter une fonctionnalité de recherche à une base de données d'informations de contact. Lorsque l'utilisateur entre dit "Smith" je veux que le résultat retourne et affiche toutes les lignes de table où le prénom, le nom ou même l'adresse contient le mot Smith etc.Requête SQL à partir de plusieurs colonnes avec instruction préparée

Dites-moi si c'est la mauvaise approche, mais je se sont installés sur l'utilisation d'une chaîne standard SQL Server configuré comme ceci:

SELECT * FROM contacts WHERE firstName LIKE ? OR lastName LIKE ? OR email LIKE ? 

Bien sûr, la chaîne de requête réelle sera beaucoup plus longue que cet exemple parce qu'il comprendra la plupart des colonnes du tableau. 1) Je préfère utiliser des instructions préparées lors de l'interrogation de la sécurité de la base de données, mais lorsque je mets la chaîne sql en haut, le code recherche une instruction distincte pour chaque? Comment est-ce que je peux juste répéter le même "LIKE?" pour chaque colonne? Ou est-il un moyen de régler cela semblable à:

SELECT * FROM contacts WHERE firstName, lastName, email LIKE ? 

Quand je passe d'abord la chaîne dans le PreparedStatement, je l'entourent avec des caractères génériques (%).

2) Serai-je capable de rechercher à la fois les colonnes VARCHAR et INT? J'ai fini par utiliser une petite partie de la structure Spring afin de pouvoir utiliser des paramètres nommés. Malheureusement, JDBC n'a pas cette fonctionnalité. Cela signifiait inclure une petite partie de la structure de Spring dans mon chemin de construction afin que je puisse utiliser le pot de jdbc. Sinon, j'aurais pu passer dans ma chaîne de recherche pour chaque paramètre de la chaîne de requête, mais cela entraînerait un code moche/difficile à lire et je ne voulais pas pirater en utilisant la même chaîne, c'est pourquoi j'ai choisi d'utiliser paramètres.

Répondre

1

Non, vous ne pouvez pas faire cela. Vous devez le faire comment vous l'avez dans la première requête:

SELECT * FROM contacts WHERE firstName LIKE ? OR lastName LIKE ? OR email LIKE ? 
+0

Je pensais ainsi, juste pensé que je jetterais là-bas. Qu'en est-il de l'utilisation des états préparés? Comment puis-je transmettre une seule valeur et l'utiliser dans tous les cas? dans la chaîne? – ryandlf

+0

Vous devriez pouvoir utiliser des paramètres nommés pour cela (c'est-à-dire: foo) car sinon, cela dépend du paramètre 'numbers'. – judda

+0

Err ... malheureusement j'utilise JDBC et il ne supporte pas les paramètres nommés. – ryandlf

Questions connexes