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

SQL Oracle Discussion :

REGEX_REPLACE pour enlever les doublons d'une chaine [10gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut REGEX_REPLACE pour enlever les doublons d'une chaine
    Bonjour bonjour.

    J'ai un soucis avec une requête SQL qui utilise WM_CONCAT (oui, je sais, c'est pas bien...) et qui créée donc une liste de valeurs séparées par une virgule.

    Cette requête est une sous-requête d'une autre requête dans laquelle j'utilise la clause "REGEX_REPLACE" afin d'enlevé les doublons de valeurs.
    On va pas se le cacher, j'ai trouvé la syntaxe de la clause sur internet. Cependant, dans mon cas, cela ne fonctionne pas...

    Je vais juste joindre le select du regex replace avec un exemple de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT RTRIM( REGEXP_REPLACE('228109,202119,228109', '([^,]*)(,\1)+($|,)', '\1\3'), ',') Num2s 
    FROM dual
    Donc a un bien un doublon de la valeur "228109" mais ma requête ne le supprime pas (je dois avoir normalement en résultat : "228109,202119")...

    I need your help

    Bisous bisous

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Je suppose que la chaine peut avoir un nombre de valeurs qui change? Et les doublons peuvent se trouver n'importe où? Si oui ce ne sera pas possible de les supprimer avec un simple regexp_replace. Pourquoi ne pas les éliminer avant la concaténation, ce serait quand même plus simple? Parce que là il faut resplitter les valeurs, éliminer les doublons, puis reconcaténer.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Faîtes un DISTINCT avant dans une sous requête, ou alors vous pouvez même utiliser DISTINCT directement dans WM_CONCAT mais peut être pas si la requête est stocker en PL/SQL dans les anciennes versions d'oracle.
    Ou recréer votre propre wm_concat_distinct en y implémentant le DISTINCT :
    https://oracle-base.com/articles/mis...ques#wm_concat

  4. #4
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Merci pour vos réponses, même si c'est ce qui me faisait un peu peur, je suis pas sûr que le distinct passe dans tous les cas.
    J'étais déjà tombé sur le lien que tu m'as mis sku... J'espère pouvoir y échapper, j'avais espoir que regex_replace suffise

    Je mets pas en résolu au cas où mais je vais tester le distinct voir si il fonctionne (par rapport à mon fonctionnel) sinon j'aviserais

    Merci

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Comme vous n'avez pas de listagg distinct en 10g:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select listagg(decode(subs, nvl(nextsubs, ' '), null, subs), ',') as withoutdups from (     
        select subs, lead(subs, 1) over(partition by null order by subs) as nextsubs from (
            select subs from json_table(
              replace(json_array('228109,202119,228109'), ',', '","'),
              '$[*]' columns (
                subs varchar2(4000) path '$'
              )
            )
        )
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    withoutdups
    202119,228109

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    En 10g il n'y a en effet pas de LISTAGG, mais encore moins de JSON_TABLE introduit en 12.1 et JSON_ARRAY introduit en 12.2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pour supprimer les doublons d'une table qcq
    Par lamjed dans le forum Oracle
    Réponses: 7
    Dernier message: 19/12/2008, 16h42
  2. une fonction pour enlever les doublons d'un array
    Par secteur_52 dans le forum Delphi
    Réponses: 1
    Dernier message: 27/06/2006, 13h45
  3. enlever les 0 devant une chaine
    Par linux dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 17/03/2006, 11h06
  4. enlever les '0' devant une chaine
    Par linux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2006, 19h12
  5. algorithme pour enlever les occurences d'une liste
    Par bendenice dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/02/2006, 23h28

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