231 votes

Compter le nombre d'occurrences d'une chaîne de caractères dans un champ VARCHAR ?

J'ai une table comme celle-ci :

TITLE          |   DESCRIPTION
------------------------------------------------
test1          |   value blah blah value
test2          |   value test
test3          |   test test test
test4          |   valuevaluevaluevaluevalue

J'essaie de trouver comment renvoyer le nombre de fois qu'une chaîne apparaît dans chacune des DESCRIPTION.

Ainsi, si je veux compter le nombre de fois où 'valeur' apparaît, l'instruction sql retournera ceci :

TITLE          |   DESCRIPTION                  |   COUNT
------------------------------------------------------------
test1          |   value blah blah value        |   2
test2          |   value test                   |   1
test3          |   test test test               |   0
test4          |   valuevaluevaluevaluevalue    |   5

Y a-t-il un moyen de le faire ? Je ne veux pas utiliser de php du tout, seulement mysql.

5 votes

Les réponses ci-dessous vous y conduiront. Cependant, n'oubliez pas d'utiliser CHAR_LENGTH() au lieu de LENGTH() si vous utilisez des caractères multi-octets.

0 votes

Ce fil a également été répondu sur ici

0 votes

Bonjour, comment puis-je faire cela avec sqlserver query ?

3voto

jfx Points 101

Il s'agit de la fonction mysql utilisant la technique de l'espace (testée avec mysql 5.0 + 5.5) : CREATE FUNCTION count_str( haystack TEXT, needle VARCHAR(32)) RETURNS INTEGER DETERMINISTIC RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );

1voto

SELECT 
id,
jsondata,    
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "sonal", "") ) 
    ) / LENGTH("sonal")        
)
+
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "khunt", "") ) 
    ) / LENGTH("khunt")        
)
AS count1    FROM test ORDER BY count1 DESC LIMIT 0, 2

Merci Yannis, votre solution a fonctionné pour moi et je partage ici la même solution pour plusieurs mots-clés avec ordre et limite.

1voto

Duc Toan Pham Points 199

Dans la plupart des cas, ces fonctions sont respectivement LENGTH et REPLACE (les utilisateurs de SQL Server utiliseront la fonction intégrée LEN plutôt que LENGTH) :

Exemple, compter le nombre de virgules dans la chaîne "10,CLARK,MANAGER".

select (length('10,CLARK,MANAGER')-
        length(replace('10,CLARK,MANAGER',',','')))/length(',')
as cnt from t1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X