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 :

[18c] Valeurs multiples extraites d'une chaîne de caractères


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 227
    Par défaut [18c] Valeurs multiples extraites d'une chaîne de caractères
    Bonjour à tous,

    J'ai une difficulté dans l'intégration d'une condition dans une requête SQL.
    En effet, j'ai comme paramètre de ma procédure le nom d'un fichier CSV qui comporte plusieurs valeurs possibles.
    En gros ce sera quelque chose comme ça :


    Bien évidemment le nombre de valeurs dans le fichier CSV peut être variable.

    Alors bien sûr, j'ouvre le fichier je fais un UTL_FILE.GET_LINE pour récupérer le contenu du fichier dans une variable.

    Le but final que je dois atteindre, c'est une requête du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT mes_champs FROM ma_table
    WHERE champ1 IN ('AA','BB','CC','DD);
    Pas simple.
    Quelqu'un aurait-il une idée ?

    Je vous remercie.

    Michel

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    En gardant le paramètre complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSTR(';'|| param ||';'||, ';'|| champ ||';') > 0

    exemple démontrant le focntionnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT p.p1, matable.champ, INSTR(';'|| p.p1 ||';', ';'|| matable.champ ||';') ok
    FROM (SELECT 'x' champ FROM dual 
    UNION ALL SELECT 'AA' champ FROM dual 
    UNION ALL SELECT 'AAA' champ FROM dual 
    UNION ALL SELECT 'A' champ FROM dual 
    UNION ALL SELECT 'BB' champ FROM dual 
    ) matable, (select 'AA;BB;CC' p1 from dual) p
     
    P1	CHAMP	OK
    "AA;BB;CC"	"x"	0
    "AA;BB;CC"	"AA"	1
    "AA;BB;CC"	"AAA"	0
    "AA;BB;CC"	"A"	0
    "AA;BB;CC"	"BB"	4

  3. #3
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 227
    Par défaut
    Merci pour ta réponse,

    Soit tu n'as pas compris mon problème, car je l'ai pas suffisamment expliqué, soit je n'ai pas compris ta réponse. Soit les deux.

    Au départ, je ne sais pas ce qu'il y a dans le fichier CSV. Je sais uniquement que c'est une liste de N chaînes de caractères séparés par un point virgule.

    Une fois que j'aurai récupéré ce qu'il y a dans le fichier CSV, j'aurai une variable avec pour valeur, une chaîne de caractères du genre : XX;XX;XX;XX;XX

    En ensuite je veux extraire chacune des valeurs de cette chaine pour que ça devienne la requête que j'ai indiqué dans mon premier message.

    Je ne peux donc pas dans ma requête tester les valeurs de ce que je vais trouver dans le fichier CSV. puisque je ne sais pas à l'avance ce qu'il y aura dedans.


    Michel

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Si ton champ dans Excel contient "AA;BB;CC;DD", et que tu veux sélectionner toutes les valeurs de ta table dont champ1 vaut soit AA, soit BB, soit CC, soit DD, alors ma réponse est bonne

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT mes_champs FROM ma_table
    WHERE INSTR(';'|| P_valeurCsv ||';', ';'|| champ1 ||';') > 0
    avec P_ValeurVsv = 'AA;BB;CC;DD'

  5. #5
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 227
    Par défaut
    Ah ok. Et bien je vais tester ça alors.
    Je te remercie.

  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
    Bonjour,

    Il faut utiliser la technique "connect by level <=" pour splitter les valeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select regexp_substr('AA;BB;CC;DD', '[^;]+', 1, level) val
    from dual
    connect by level <= regexp_count('AA;BB;CC;DD', ';') + 1;
    Ainsi tu peux utiliser cette vue pour ta jointure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with vals as (select regexp_substr(ta_variable, '[^;]+', 1, level) val
    from dual
    connect by level <= regexp_count(ta_variable, ';') + 1)
    SELECT mes_champs FROM ma_table
    WHERE champ1 IN (select vals.val from vals);

  7. #7
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 227
    Par défaut
    J'ai finalement utilisé la solution de McM, et ça marche nickel..
    (Je n'avais aucun doute )

    Merci à vous deux.

    Michel

  8. #8
    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
    Ok, mais l'utilisation d'un index régulier ne sera pas possible avec cette solution car la fonction est appliquée sur la colonne. Si ta table n'est pas immense ce n'est pas très grave.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/11/2009, 16h34
  2. Recherche de valeurs dans une chaîne de caractères
    Par julieng31 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 18/08/2009, 15h43
  3. [PHP 5.0] Occurences multiples à remplacer dans une chaîne
    Par oneTime dans le forum Langage
    Réponses: 5
    Dernier message: 14/04/2009, 00h36
  4. [RegEx] Changer la valeur d’un attribut dans une chaîne
    Par sara21 dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2008, 19h31
  5. Réponses: 4
    Dernier message: 24/07/2006, 17h34

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