2010-01-23 5 views
0

Y at-il un moyen d'écrire une requête sql qui trouve toutes les lignes où la valeur du champ est une sous-chaîne d'une chaîne donnée.mysql: trouve les lignes qui ont un champ qui est une sous-chaîne de "chaîne"

Exemple:

table names 

Name  |  Nickname 
rohit   iamrohitbanga 
banga   rohitnick 
sinan   unur 

requête doit être quelque chose comme

select * from names where Name is a substring of "who is rohit"; // to get first row 
select * from names where Nickname is a substring of "who is rohitnick"; // to get second row 
select * from names where Name is a substring of "who is unur and banga" 
or Nickname is substring of "who is unur and banga"; // to get second and third row 

Comment est-il possible?

Si ce n'est pas possible alors je devrai obtenir ce comportement en Java. J'utilise jdbc: pilote mysql pour se connecter à la base de données.

Mise à jour vos solutions fonctionnent

maintenant un peu d'une torsion. si nous voulons vérifier si une sous-chaîne du champ se produit en tant que sous-chaîne de la chaîne que nous spécifions.

select * from names where Name is a substring of "who is sina"; // to get third row 
+1

Il est irrespectueux envers ceux qui ont fourni des réponses pour changer les critères par la suite. –

+1

@iamrohitbanga: Je suis d'accord avec 'OMG Ponies'. Les affiches ne sont pas averties que vous avez modifié votre question, donc la plupart ne mettront pas à jour leurs réponses. Si votre problème initial est résolu, acceptez une réponse et n'hésitez pas à ajouter une autre question. De plus, je ne vois pas la différence entre votre nouvelle requête ('Name est la sous-chaîne de quelque chose') et les requêtes d'origine (' Name est la sous-chaîne de quelque chose') –

+0

convenu! vous avez raison –

Répondre

3

Si l'un des Name ou Nickname doit être trouvé dans le texte utiliser

SELECT * 
FROM names 
WHERE instr("who is Rohit", Name) > 0 
    OR instr("who is Rohit", Nickname) > 0 

Aucun indice ne peut être utilisé pour cela, il pourrait prendre longtemps pour que de grandes tables.

1
SELECT * FROM names WHERE INSTR(Nickname,Name) > 0; 

ou, ce qui revient:

SELECT * FROM names WHERE LOCATE(Name,Nickname) > 0; 
+0

no. fireeyedboy semble l'avoir fait correctement. Je vais tester ça. de toute façon vous avez souligné la même fonction. –

+0

Je suis désolé, je ne comprends pas la question alors. :) Mais d'accord. –

2

Un problème avec toutes ces approches est vos index vont par la fenêtre. Vous devrez faire une analyse de table pour chaque rangée, ce qui signifie que votre performance ne fera qu'empirer à mesure que la taille de la table augmente.

Je repenserais cette approche si votre table va être grande. Peut-être que vous avez besoin d'un chercheur indexé comme Lucene.

+0

J'ai lucene à l'esprit. mais en ce moment pour le prototype je veux quelque chose de simple. –

+0

un doute que j'ai, c'est que mes champs sont généralement petits. Cela vaut donc la peine de créer un «Document» de Lucene pour chaque rangée. Lucene ferait correspondre les documents basés sur tf/idf, qui mesure la fréquence. donc mes deux documents seraient petits. Lucene est une bonne option. –

1

Vous pouvez également inverser la condition LIKE.

select * from names where "who is rohit" LIKE CONCAT('%', Name, '%'); 

Notez que ceci est probablement pas plus vite que instr (« qui est Rohit », nom) mais il peut être.

Questions connexes