Obtenez le nombre exact de correspondances dans le champ de texte MySQL
P粉493534105
P粉493534105 2023-09-09 10:37:09
0
1
666

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粉493534105
P粉493534105

répondre à tous(1)
P粉807471604

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 :

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.

Explication des expressions régulières

(?<=^|,)4(?=$|,) recherche « 4 » qui répond aux critères suivants :

  • avant la virgule ou le début de la chaîne
  • Après la virgule ou la fin de la chaîne

Pour les anciennes versions de MySQL

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.

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 2 REPLACE(..., ",4,", ",_, sont nécessaires ").

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal