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
Pour MySQL 8.X
Vous pouvez utiliser
REGEXP_REPLACE
pour trouver les 4, les supprimer de la chaîne et calculer la différence de longueur :Cela renverra le nombre de "4" dans chaque ligne, et vous pourrez ensuite tous les additionner :
Vous pouvez également utiliser
AS
pour renommer ces valeurs.Explication des expressions régulières
(?<=^|,)4(?=$|,)
recherche « 4 » qui répond aux critères suivants :Pour les anciennes versions de MySQL
La requête est très moche, mais vous pouvez utiliser ceci :
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.Pourquoi est-il autant utilisé
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 2REPLACE(..., ",4,", ",_, sont nécessaires ")
.