skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

jeudi 11 mars 2010

SQL Server : compter le nombre d'occurrences dans une chaîne

Publié par Infinite Loop, à 12 h 47 2 commentaires

Je profite de mon heure de dîner pour écrire mon billet d'aujourd'hui puisque je viens à l'instant de trouver ce truc très utile en Transact-SQL (T-SQL) pour SQL Server.

J'avais un texte dans lequel je voulais compter le nombre d'occurrences trouvées d'une autre chaîne. En regardant la documentation pour trouver une fonction built-in qui me permettrait de le faire, j'en suis venu à un constat que le nombre de fonctions disponibles est assez limité : il y aurait une possibilité de faire une boucle en utilisant CHARINDEX mais ce n'était pas l'idéal.

Sinon, il existe ce truc encore plus efficace et étonnamment simple :

DECLARE
@count integer,
@search varchar(10),
@long_string varchar(500)

SET @search = '18'
SET @long_string = 'code 18 code 18 code 18 code code code 18'

SET @count = (DATALENGTH(@long_string) - DATALENGTH(REPLACE(@long_string, @search, ''))) / DATALENGTH(@search)

SELECT @count
Il ne reste qu'à dissimuler ce snippet de code réutilisable dans une user defined function et à lui faire appel dans le contexte qui nous convient le mieux.


Tags: SQL Server

2 réponses à "SQL Server : compter le nombre d'occurrences dans une chaîne"

  1. Anonyme a dit...
    17 janvier 2012 à 03 h 14

    Excellente idée !

    Anonyme a dit...
    7 février 2020 à 10 h 21

    Bonjour
    Eureka ! C'est exactement ce que j'ai besoin de faire mise à part que ma requête doit me retourner plusieurs résultats. J'ai donc tenté une adaptation :

    DECLARE
    @count integer,
    @search varchar(1),
    @long_string varchar(200)
    SET @search = '_'
    SET @long_string = (SELECT distinct [ses_CODSTAGE] FROM [dm_PRODUCTION].[vf_CA_HIHVHP] where [ses_CODSTAGE] is not null)
    SET @count = ((DATALENGTH(@long_string) - DATALENGTH(REPLACE(@long_string, @search, ''))) / DATALENGTH(@search)+1)

    SELECT @long_string, @count

    Mais j'ai le message d'erreur suivant :
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    Warning: Null value is eliminated by an aggregate or other SET operation.

    Pouvez-vous m'aider ?
    Merci


Publier un commentaire

Message plus récent Messages plus anciens Accueil
S'abonner à : Publier des commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ▼  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ▼  mars 2010 (34)
        • Échanger 4 trente sous pour une piastre
        • Internet Explorer et indexOf()
        • Trier un objet JSON par clé
        • Redirection à www avec .htaccess
        • Citation no. 75 sur l'histoire
        • Gang de rue des écureuils
        • Retour sur le Pecha Kucha Montréal # 16
        • Pianistes mystérieux en vidéo
        • PostgreSQL : sélection d'une table implicite
        • Anecdotes allemandes
        • Calcul inversé des taxes du Québec
        • Citation no. 74 sur la bicyclette
        • Rollover de bouton en CSS
        • Page Facebook de Code 18
        • Parent d'un élément avec jQuery
        • Logiciel libre au gouvernement
        • Born of Hope, pour fans de Lord of the Rings
        • 16 articles à lire si vous êtes programmeur
        • Citation no. 73 sur le ridicule
        • Théorie des trois pas
        • Comparaison iPad vs ExoPC slate
        • SQL Server : compter le nombre d'occurrences dans ...
        • Collection d'animations de chargement
        • Vitesse de frappe
        • Demandez-moi ce que vous voulez
        • Retour sur la 1ère édition de Ignite Montréal
        • Negative lookahead dans une regex
        • Citation no. 72 sur la parole
        • Che, partie 1 et 2
        • Recevoir des alertes lorsque Google indexe des pages
        • Auto-découverte pour OpenSearch
        • Travailler chez Google
        • Combat : Firefox vs Internet Explorer
        • Les chips les plus piquantes au monde
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (430)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft