Comment trouver le nombre d’occurrences d’une chaîne de caractères dans MySQL?

Il n’existe pas de fonction dans MySQL  (et bien d’autres SGBD) pour trouver le nombre d’occurrences d’une chaîne de caractères dans une autre.  Par exemple, combien de fois « ait » apparaît dans la chaîne « Il était grand mais il avait peur » ?

Ou, comme on me l’a récemment demandé sur IRC, vous cherchez à déterminer le nombre d’occurrences d’une sous-séquence particulière (par exemple, « TAT ») dans la séquence génomique suivante :

ATTGGTGGGCTCTACTAAGATATCAACGGGACTTCGGAGCGTGCCGCACTATTT

Évidemment, vous pouvez lire les données du SGBD puis faire la recherche en mémoire en utilisant votre langage de programmation préféré mais comment faire le tout en SQL ?

La solution est simple et elle a la forme suivante :


SELECT FLOOR(( LENGTH(source) - LENGTH(REPLACE(source, chaineAChercher, '')) ) / (LENGTH(chaineAChercher))) as occ

Pour revenir à notre exemple, la source étant la longue séquence génomique et « chaineAChercher » étant « TAT », cela donnerait :


SELECT FLOOR(( LENGTH('ATTGGTGGGCTCTACTAAGATATCAACGGGACTTCGGAGCGTGCCGCACTATTT') - LENGTH(REPLACE('ATTGGTGGGCTCTACTAAGATATCAACGGGACTTCGGAGCGTGCCGCACTATTT', 'TAT', '')) ) / (LENGTH('TAT'))) as occ

La réponse à notre petit problème ? La voici!

Heureusement dans la vie, il y a plus de solutions que de problèmes… Et parfois de longues requêtes SQL!

Advertisements

3 commentaires pour Comment trouver le nombre d’occurrences d’une chaîne de caractères dans MySQL?

  1. Gilles Jobin dit :

    L’idée est brillante. Merci !!!

    J'aime

  2. Thomas dit :

    Merci, cette requête m’a bien aidé pour nettoyer une base de données aujourd’hui!

    J'aime

  3. meganic dit :

    Bonjour,
    ça peut-être utile en effet.. Attention par contre. si la chaine est du genre :
    ‘machaine;blabla ;’ avec le nombre d’occurences de ‘;’ à trouver.
    le resultat retourné sera incorrect car le replace du dernier ‘;’ avec un espace devant va faire que le LEN(REPLACE(…)) sera diminué de 3 au lieu de 2 (dernier espace ignoré par le LEN().
    (je parle en MS SQL)
    Donc attention…

    J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :