Maison > Questions et réponses > le corps du texte
J'ai une table MySql avec un champ de texte.
Le champ de texte sera rempli avec une séquence aléatoire similaire à la suivante (peut être n'importe quelle valeur entière) :
14,4,24,20,34,2
34,67,4,98,64
Aucune virgule de début ou de fin dans les chaînes (valeurs de champ de texte).
Par exemple, je souhaite compter le nombre total d'occurrences de seulement « 4 ».
Une requête sur ces deux lignes devrait renvoyer 2 au lieu de 7.
Je ne sais pas comment rédiger une requête comme celle-ci.
Merci
P粉8074716042023-09-10 00:31:48
Vous pouvez utiliser REGEXP_REPLACE
pour trouver les 4, les supprimer de la chaîne et calculer la différence de longueur :
SELECT LENGTH(vals) - LENGTH(REGEXP_REPLACE(vals, '(?<=^|,)4(?=$|,)', '')) FROM T;
Cela renverra le nombre de "4" dans chaque ligne, et vous pourrez ensuite tous les additionner :
SELECT SUM(LENGTH(vals) - LENGTH(REGEXP_REPLACE(vals, '(?<=^|,)4(?=$|,)', ''))) FROM T;
Vous pouvez également utiliser AS
pour renommer ces valeurs.
(?<=^|,)4(?=$|,)
recherche « 4 » qui répond aux critères suivants :
La requête est très moche, mais vous pouvez utiliser ceci :
SELECT vals, LENGTH(Replace(Replace(Concat(',', vals, ','), ',4,', ',_,'), ',4,', ',_,')) - LENGTH(Replace(Replace(Replace(Concat(',', vals, ','), ',4,', ',_,'), ',4,', ',_,'), "_", "")) AS NB4 FROM test_table;
Cela commence par remplacer toutes les occurrences de "4" par un trait de soulignement (_
) (par exemple, ne pas remplacer 4 sur 54).
Il calcule ensuite la longueur de la chaîne avec ces traits de soulignement moins la longueur de la chaîne sans traits de soulignement, qui correspond au nombre de « 4 » dans votre liste.
REPLACE
? En testant la requête, j'ai découvert que la fonction REPLACE
函数的行为与我们期望的不同。以这个例子为例:4,4,4,4,4
,如果使用单个Replace,我们期望它返回_,_,_,_,_
。然而,它会原地替换逗号,如果逗号“匹配”两次,它不会计算第二次,这就是为什么需要2个REPLACE(..., ",4,", ",_,")
de MySQL se comportait différemment de ce à quoi nous nous attendions. En prenant cet exemple : 4,4,4,4,4
, si un seul remplacement est utilisé, nous nous attendons à ce qu'il renvoie _,_,_,_,_
. Cependant, il remplace la virgule en place, et si la virgule "correspond" deux fois, elle ne compte pas la deuxième fois, c'est pourquoi 2 REPLACE(..., ",4,", ",_, sont nécessaires ")
.