recherche

Maison  >  Questions et réponses  >  le corps du texte

Obtenez le nombre exact de correspondances dans le champ de texte MySQL

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粉493534105P粉493534105441 Il y a quelques jours668

répondre à tous(1)je répondrai

  • P粉807471604

    P粉8074716042023-09-10 00:31:48

    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 ").

    répondre
    0
  • Annulerrépondre