Compter les occurrences de caractère dans une chaîne en utilisant MySQL

Exemple de mots: a, akkka, akokaa, kokoko, kakao, oooaooa, kkako, kakaoa

J'ai besoin de la sorcière regexp donne des mots avec 2 ou moins ' a 'mais pas les mots sans' a '

Résultat: un, akka, kakao, oooaooa, kkako

Ok en fait, j'utilise:

SELECT word FROM dictionary_gr WHERE word REGEXP 'λ{2,3}' LIMIT 0 , 30

Cela renvoie 0 lignes il y a des mots avec 2 λ et 3 λ

21
demandé sur Simon 2013-01-04 16:47:27

3 réponses

select *  
from table  
where  LENGTH(name) - LENGTH(REPLACE(name, 'a', '')) between 1 and 2

Mis à jour pour utiliser entre.

35
répondu Woot4Moo 2013-01-04 12:58:47

Je ne sais pas ce que MySQL supporte en termes d'assertions lookaround, mais ce qui suit fera l'affaire:

^(?=.*a.*a?.*)(?!.*a.*a.*a.*).*$

, Nous avons une anticipation affirmation qui correspond à 1 ou 2 a caractères dans la chaîne. Ensuite, nous avons un lookahead négatif qui ignore 3 ou plus a s n'importe où dans la chaîne. Ensuite, le motif final correspond simplement à la chaîne entière, à condition que les deux premières assertions soient satisfaites.

Si MySQL ne supporte pas les lookarounds, alors la réponse de @Woot4Moo serait le chemin aller.

2
répondu Xophmeister 2013-01-04 12:57:54

Rapide et sale:

Select word, number_of_as From
(
 Select 'akkka' word, REGEXP_COUNT('akkka', 'a') number_of_as From dual
)
Where number_of_as <= 2
/
-2
répondu Art 2013-01-04 15:33:44