IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Compter le nombre d'apparition d'un caractère


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 183
    Par défaut Compter le nombre d'apparition d'un caractère
    Bonjour,

    Y-a-t'il une fonction qui me permettre de compter le nombre d'apparition d'un caractère dans une chaine? Par exemple dans la chaine suivante, j'aimerai connaitre le nombre de fois qu'apparait le caractère '@', c'est-à-dire 2 fois

    Exemple: mon@dresse@11752

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Je ne connais pas de fonction native intégrée à SQL Server permettant de faire cela, mais il existe une fonction CHARINDEX très pratique. On utilisant la fonction CHARINDEX dans une petite boucle, il est très facile de déterminer le nombre d’occurrence d’une sous-chaine dans une chaine.

    Ci-dessous une fonction que j’ai concoctée et qui répond à ta demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    CREATE FUNCTION dbo.FC_U_CountSubStr ( 
            @pi_String varchar(8000), 
            @pi_SubString varchar(8000)
            )  
      RETURNS INT 
      AS 
      BEGIN 
    	  DECLARE @LenString INT, 
    		@i INT = 1, 
    		@p INT = 0, 
    		@NbrOccurrence INT = 0; 
     
    	  SET @LenString  = len(@pi_String); 
     
    	  WHILE @i <= @LenString 
    	  BEGIN 
    		 SET @p = charindex (@pi_SubString, @pi_String, @i) 
    		 IF @p > 0 
    		   SET @NbrOccurrence += 1;  
    		 ELSE 
    		   BREAK;    
    		 SET @i = @p +1 ; 
    	  END; 
        RETURN @NbrOccurrence; 
      END;   
      GO
    Exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.FC_U_CountSubStr('mon@dresse@11752', '@') aS  nombreOccurrences
    Résultat :


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut
    Il existe une autre solution, que je trouve très astucieuse :

    1. Tu comptes le nombre de caractères de ta chaîne (fonction LEN)
    2. Tu remplace le caractère que tu souhaites dénombrer par une chaine vide (fonction REPLACE).
    3. Tu comptes le nombre de caractères de la chaîne résultante.
    4. Tu soustrais le résultat du point 3 du point 1.

    Un exemple : compter le nombre de "I'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @Chaine as varchar(100)
    SET @Chaine = 'IL VA PLEUVOIR'
    SELECT LEN(@Chaine) - LEN(REPLACE(@chaine,'I', ''))
    Résultat : 2

    Pas besoin de boucle et moins de code a écrire !

    A+

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Bien joué !
    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut
    Très astucieux !
    merci

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    À titre de comparaison....

    1) fonction de hmira optimisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    CREATE FUNCTION dbo.F_COMPTE_LETTRE_1 (@STRING VARCHAR(8000),
                                           @LETTRE CHAR(1)) 
    RETURNS SMALLINT
    WITH RETURNS NULL ON NULL INPUT
    AS 
    BEGIN 
    DECLARE @LEN SMALLINT, 
    		@I   SMALLINT = 0, 
    		@J   SMALLINT, 
    		@NBR INT = 0; 
     
    SET @LEN  = LEN(@STRING); 
     
    WHILE @I <= @LEN
    BEGIN 
       SET @J = CHARINDEX (@LETTRE, @STRING, @I) 
       IF @J > @I 
       BEGIN
          SELECT @I = @J+1, @NBR += 1;
          CONTINUE;
       END    
       ELSE
                BREAK; 
    END;   
    RETURN @NBR;
    END
    GO
    Fonction de Philippe Robert optimisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE FUNCTION dbo.F_COMPTE_LETTRE_2 (@STRING VARCHAR(8000),
                                           @LETTRE CHAR(1)) 
    RETURNS SMALLINT
    WITH RETURNS NULL ON NULL INPUT
    AS 
    BEGIN 
       RETURN LEN(@STRING) - LEN(REPLACE(@STRING, @LETTRE, ''));
    END
    GO
    tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT   dbo.F_COMPTE_LETTRE_1('abracadabra', 'a')
    SELECT   dbo.F_COMPTE_LETTRE_1('locomotive', 'a')
    SELECT   dbo.F_COMPTE_LETTRE_1(NULL, 'a')
     
    SELECT   dbo.F_COMPTE_LETTRE_2('abracadabra', 'a')
    SELECT   dbo.F_COMPTE_LETTRE_2('locomotive', 'a')
    SELECT   dbo.F_COMPTE_LETTRE_2(NULL, 'a')
    Test en vrai grandeur : table de 1 250 000 employés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @T1 DATETIME2, @T2 DATETIME2
    SET @T1 = GETDATE()
    SELECT EMP_ID, EMP_NOM, dbo.F_COMPTE_LETTRE_?(EMP_NOM, 'E')
    FROM   dbo.T_EMPLOYEE_EMP
    SET @T2 = GETDATE()
    SELECT DATEDIFF(ms, @T1, @T2)
    Résultat :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fonction                temps (ms)
    ----------------------- ----------
    dbo.F_COMPTE_LETTRE_1       8 043
    dbo.F_COMPTE_LETTRE_2       7 717
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/04/2008, 16h19
  2. Réponses: 7
    Dernier message: 18/01/2008, 14h36
  3. Réponses: 17
    Dernier message: 06/09/2006, 15h23
  4. Compter le nombre d'apparitions d'une valeur
    Par dynexd dans le forum Access
    Réponses: 4
    Dernier message: 07/04/2006, 01h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo