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!
P.S. Cet ajout pourrait grandement vous intéresser!
L’idée est brillante. Merci !!!
J’aimeJ’aime
Merci, cette requête m’a bien aidé pour nettoyer une base de données aujourd’hui!
J’aimeJ’aime
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’aimeJ’aime