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 :

Analyser le contenu d'un champ Oracle


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut Analyser le contenu d'un champ Oracle
    Bonjour,
    Je cherche à vérifier si un champ ne contient que des valeurs autorisées

    J'ainsi une table de la forme suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID_CLE, NB_VALEURS, DONNEES_A_VERIFIER
    1, 2, 18|28
    2, 2, 7|34
    3, 4, 18|28|38|48
    4, 1, 8
    5, 3, 18|27|48
    ...
    J'aimerais savoir comment écrire une requête SQL qui extrait de ma table uniquement les enregistrements pour lesquels les valeurs du champ "DONNEES_A_VERIFIER" sont parmi celles autorisées : 18, 28, 38, 48 et qui ajoute un champ pour donner le résultat de la vérification (NOK si autre chose que 18, 28, 38 ou 48 à partir du moment où on a au moins 18 ou 28 ou 38 ou 48 ?

    Je n'arrive pas à savoir comment faire.

    En résultat, j'aimerais avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID_CLE, NB_VALEURS, DONNEES_A_VERIFIER, VERIF
    1, 2, 18|28, OK
    3, 4, 18|28|38|48, OK
    5, 3, 18|27|48, NOK
    Merci beaucoup à tous pour vos idées.

    MarieO

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Créer une colonne virtuelle avec la fonction DECODE, ça marche pas?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Ca doit certainement marcher, mais ma question est qu'est-ce que je mets dans le DECODE ?

    Si je fais un DECODE(DONNEES_A_VERIFIER,18,...) jamais je n'aurais OK ou NOK car je dois regarder les valeurs qui ne sont pas des '|'.

    Je sais que je vais faire une clause WHERE avec la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     where DONNEES_A_VERIFIER like '%18%' or DONNEES_A_VERIFIER like '%28%' or DONNEES_A_VERIFIER like '%38%' or DONNEES_A_VERIFIER like '%48%'
    Par contre, je ne sais pas comment faire ce DECODE pour qu'il me dise
    - OK si je n'ai que 18 et/ou 28 et/ou 38 et/ou 48 dans DONNEES_A_VERIFIER
    - NOK à partir du moment où j'ai autre chose que 18, 28, 38 ou 48 dans DONNEES_A_VERIFIER.

    Merci encore.
    MarieO

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Attention,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where DONNEES_A_VERIFIER like '%18%' or DONNEES_A_VERIFIER like '%28%' or DONNEES_A_VERIFIER like '%38%' or DONNEES_A_VERIFIER like '%48%'
    va te retourner la ligne "5, 3, 18|27|48, NOK"
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    C'est bien ce que je veux.

    En résultat, je veux avoir TOUTES les lignes qui ont au moins 18 ou 28 ou 38 ou 48 dans le champ "DONNEES_A_VERIFIER", et pas du tout les lignes qui ne contiennent pas ces valeurs dans DONNEES_A_VERIFIER.

    Par contre, je veux en plus un champ "VERIF" qui me dira si l'enregistrement retourné est "OK (que 18 et/ou 28 et/ou 38 et/ou 48) ou "NOK" si au moins une valeur de DONNEES_A_VERIFIER n'est pas 18, 28, 38 ou 48.

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    "je veux avoir TOUTES les lignes qui ont au moins 18 ou 28 ou 38 ou 48 "
    Je ne comprends alors pas pourquoi tu ne veux pas "5, 3, 18|27|48" car elle a 18 et 48...
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Si, je la veux (cf. tableau résultat) mais flaguée "NOK" car la valeur "27" est une erreur de saisie qu'il faudra corriger...

    Je cherche toutes les lignes avec des 18, 28, 38, 48 (même celles qui contiennent autre chose) afin de voir s'il y a des lignes à "corriger" (avec autre chose que 18, 28, 38, 48).

    Mais je ne veux pas les lignes qui ne contiennent pas au moins 18 ou 28 ou 38 ou 48.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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
    with data as (      select 1 as nsq, '18|28' as to_check from dual   
        union  
        select 2 as nsq, '7|34' as to_check from dual   
        union  
        select 3 as nsq, '8|10|28' from dual 
    )  
    , checker as (  
        select d.nsq, splitted.value from data d,  
        lateral (  
            SELECT REGEXP_SUBSTR(d.to_check, '[^|]+', 1, LEVEL) AS value FROM dual  
                CONNECT BY REGEXP_SUBSTR(d.to_check, '[^|]+', 1, LEVEL) IS NOT NULL  
        ) splitted 
    )  
    select distinct nsq from checker where value not in (
            SELECT REGEXP_SUBSTR('18|28|38|48', '[^|]+', 1, LEVEL) AS value FROM dual  
                CONNECT BY REGEXP_SUBSTR('18|28|38|48', '[^|]+', 1, LEVEL) IS NOT NULL  
    );

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sans REGEXP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH t AS (SELECT 1 id_cle, 2 nb_valeurs, '18|28' donnees_a_verifier FROM dual
    UNION SELECT 3 id_cle, 4 nb_valeurs, '18|28|38|48' donnees_a_verifier FROM dual
    UNION SELECT 5 id_cle, 3 nb_valeurs, '18|27|48' donnees_a_verifier FROM dual
    )
    SELECT id_cle, nb_valeurs, donnees_a_verifier, 
    	CASE WHEN REPLACE(REPLACE(REPLACE(REPLACE('|'|| REPLACE(donnees_a_verifier, '|', '||') ||'|', '|18|'), '|28|'), '|38|'), '|48|') IS NULL THEN 'Ok' ELSE 'KO' END verif
    FROM t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID_CLE	NB_VAL	DONNEES	VERIF
    1	2	18|28	Ok
    3	4	18|28|38|48	Ok
    5	3	18|27|48	KO
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup à tous les 2 pour vos solutions.

    Je vais me servir de la solution sans REGEX car nous n'avons pas LATERAL dans notre base Oracle puisque nous sommes en 11GR2.

    MarieO

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par marieo Voir le message
    Merci beaucoup à tous les 2 pour vos solutions.

    Je vais me servir de la solution sans REGEX car nous n'avons pas LATERAL dans notre base Oracle puisque nous sommes en 11GR2.

    MarieO
    Il y a moyen de remplacer lateral() par un table(cast(multiset( ... )...))
    ce qui aurait au moins le mérite de garder un query paramétrisable...

    ou alors avec une fonction :
    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 string2numberlist( i_str IN VARCHAR2, i_sep IN CHAR ) RETURN 
        sys.odcinumberlist
    IS
        w_pattern VARCHAR2(16 char) := '[^' || i_sep || ']+' ;
        w_result sys.odcinumberlist ;
    BEGIN
        SELECT to_number(REGEXP_SUBSTR(i_str, w_pattern, 1, LEVEL)) 
            bulk collect into w_result 
            FROM dual  
                CONNECT BY REGEXP_SUBSTR(i_str, w_pattern, 1, LEVEL) IS NOT NULL ;
        return w_result ;
    END string2numberlist ;
     
    with data as (  
        select 1 as nsq, '18|28' as to_check from dual   
        union  
        select 2 as nsq, '7|34' as to_check from dual   
        union  
        select 3 as nsq, '8|10|28' from dual 
    )  
    , checker as (  
        select d.nsq, splitted.column_value as value from data d,  
            string2numberlist(d.to_check, '|') splitted
    )  
    select distinct nsq from checker where value not in (select * from string2numberlist('8|18|28|38|48','|')) ;

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/08/2011, 16h03
  2. Analyse du contenu d'un champ texte
    Par mouzillon dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 22/07/2009, 09h44
  3. Réponses: 12
    Dernier message: 06/11/2007, 15h17
  4. Contenu d'un champ tronqué dans mon input box
    Par Marmot dans le forum ASP
    Réponses: 2
    Dernier message: 27/10/2004, 13h30
  5. Recuperer le contenu d'un champs texte
    Par bouboussjunior dans le forum ASP
    Réponses: 4
    Dernier message: 29/09/2004, 14h16

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