2009-06-11 9 views
2

J'ai une colonne nommée "situation" et "entityid".Comment trouver les mots répétés d'une cellule dans SQL

Entityid Situation 
1234  In the the world of of 
3456  Total universe is is a

Quelqu'un peut-il s'il vous plaît me donner une requête pour trouver ce type de mots higlihted.

Merci Ramesh

+0

Question intéressante ... –

+0

Je ne pense pas que ce soit possible avec du SQL pur. Peut-être que si vous écrivez une fonction MySQL .... –

Répondre

0

Si vous êtes prêt à utiliser SQL Server Express, vous serez en mesure de créer une fonction définie par l'utilisateur CLR.

http://msdn.microsoft.com/en-us/library/w2kae45k(VS.80).aspx

Vous aurez alors la puissance des expressions régulières au bout des doigts. Puis, en fonction de votre compétence avec RegEx, vous êtes soit laissé avec zéro problèmes ou deux problèmes.

+0

MySQL a une fonction REGEXP. – RedFilter

+0

Oups. Je ne le savais pas. – Tormod

1

Si vous voulez coder en dur il:

select EntityID, Situation 
from Entity 
where Situation like '%the the%' 
or Situation like '%of of%' 
or Situation like '%is is%' 

Mise à jour: Voici une approche codée en dur un peu moins:

select EntityID, Situation, right(s2, diff * 2 + 1) as RepeatedWords 
from (
    select EntityID, Situation, WordNumber, 
     substring_index(Situation, ' ', WordNumber) s1, 
     substring_index(Situation, ' ', WordNumber + 1) s2, 
     length(substring_index(Situation, ' ', WordNumber + 1)) - length(substring_index(Situation, ' ', WordNumber)) -1 diff 
    from `Entity` e 
    inner join (
     select 1 as WordNumber 
     union all 
     select 2 
     union all 
     select 3 
     union all 
     select 4 
     union all 
     select 5 
     union all 
     select 6 
     union all 
     select 7 
     union all 
     select 8 
     union all 
     select 9 
     union all 
     select 10 
    ) n 
) a 
where right(s1, diff) = right(s2, diff) 
    and diff > 0 
order by EntityID, WordNumber 

Il recherche aux 10 premiers mots ou Par conséquent, il ne gère pas correctement les casse, la ponctuation ou les espaces multiples, mais il devrait vous donner une idée de l'approche que vous pouvez adopter. Si vous souhaitez gérer des chaînes plus longues, continuez simplement à ajouter les instructions UNION ALL.

+0

Cela ne semble vraiment pas dans l'esprit de ce que l'op demande. Je pense qu'ils demandent dans le cas générique où tout mot possible pourrait être répété que je suppose que regex serait le meilleur choix. –

+0

D'accord, c'est une approche de dernier recours. – RedFilter

Questions connexes