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

Requêtes MySQL Discussion :

ISNULL - comportement "bizarre"


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut ISNULL - comportement "bizarre"
    Bonjour à tous,

    je poste ici en espérant que ce sera le bon forum...

    voici j'ai la requête suivante :
    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
    SELECT 
       T1.Ind_TypoRisq,
       T1.Txt_TypoRisq AS Risque,
       T2.Index,
       ISNULL(T2.Index) AS Absent,
       T2.Ind_DU,
       T2.Ind_WU,
       T2.Actif
    FROM 
       zt_typorisq AS T1
    LEFT JOIN
       t_risqdu as T2 ON 
          ((T1.Ind_TypoRisq = T2.Ind_TypoRisq) and 
           (Ind_WU = :WU) and            
           (Ind_DU = :DU) and
           (NumETS LIKE :ETS) and 
           ((T2.Actif=1) OR (T2.Actif=0)))
    WHERE
        ((ISNULL(T2.Index)=0) OR (ISNULL(T2.Index)=:Visu))
    ORDER BY
       T1.Ind_TypoRisq
    le résultat est un tableau à 20 lignes (1 par élément de la table T1) avec les colonnes provenant de T2 renseignées ou pas selon qu'il existe une occurrence de l'enregistrement de T1 dans T2.

    cette requête fonctionne parfaitement bien et me donne les résultats attendus. Ces derniers sont exploités via Delphi. J'ai une case à cocher qui reprend le champ "Absent" qui a la valeur 1 si l'enregistrement de T1 est absent et 0 si il est présent, le tout en liste dans un composant TdbCtrlGrid... je signale tout cela mais c'est, à mon avis, sans importance pour mon problème.

    J'ai un problème lors de la première insertion de valeur dans T2. la fonction ISNULL utilisée pour le champ "Absent" renvoie des valeurs qui semblent aléatoires... mais le sont sans doute pas... Cecdi se produit uniquement lors de l'insertion de la première valeur dans la table T2 ensuite tout fonctionne...

    quelqu'un a une idée ?
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut Amenofis.

    Citation Envoyé par Amenofis
    la fonction ISNULL utilisée pour le champ "Absent" renvoie des valeurs qui semblent aléatoires...
    La requête n'est pas suffisante pour résoudre votre problème. Il nous faut :
    --> Un exemple de votre problème,
    --> la description de vos tables,
    --> Un jeu d'essai représentatif,
    --> Ce que vous désirez obtenir au final.

    Sinon, pour voir le fonctionnement de la fonction isnull(), veuillez lire la documentation officielle : http://dev.mysql.com/doc/refman/5.7/...unction_isnull

    Autre remarque : vous n'avez pas préfixé les colonnes dans la jointure (le ON).
    Est-ce que ces colonnes appartiennent toutes à la table T2 (t_risqdu) ? Ne sont-elles pas aussi présente dans la table T1 ?

    Vous faites le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE    ((ISNULL(T2.Index)=0) OR (ISNULL(T2.Index)=:Visu))
    Or d'après ce que j'ai compris, les seules valeurs sont 0 ou 1. Vous désirez toujours obtenir les valeurs à "0" et accessoirement à "1".
    Est-ce que "VISU" est toujours renseigné correctement, soit "0" ou soit "1" ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Amenofis Voir le message
    J'ai un problème lors de la première insertion de valeur dans T2
    Je ne comprends pas pourquoi vous parlez d'insertion dans T2 alors que vous ne faites que des select

    Je ne comprends pas non plus pourquoi vous mettez une collection de parenthèses inutiles qui nuisent à la lecture de la requete

    Si la colonne Actif ne contient que des nombres entiers, vous pouvez remplacer le filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and (T2.Actif=1 OR T2.Actif=0)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and T2.Actif between 0 and 1
    qui sera potentiellement plus performant

    Enfin, quelles sont les valeurs possibles de la host variable :Visu ?, je ne comprends pas ce que vous cherchez à filtrer avec votre clause where

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salur Escartefigue.

    Citation Envoyé par Escartefigue
    Si la colonne Actif ne contient que des nombres entiers, vous pouvez remplacer le filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and (T2.Actif=1 OR T2.Actif=0)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and T2.Actif between 0 and 1
    qui sera potentiellement plus performant.
    Ce que tu écris ne sert strictement à rien car le périmètre de la colonne est soit "0" ou soit "1", et rien d'autre.
    Autant ne rien mettre du tout.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salur Escartefigue.
    Ce que tu écris ne sert strictement à rien car le périmètre de la colonne est soit "0" ou soit "1", et rien d'autre.
    Autant ne rien mettre du tout.
    Rien dans le post d'Aménofis, n'indique que seulement 2 valeurs sont permises pour la colonne "Actif", de plus, je suppose que s'il y a un filtre, c'est qu'il sert à quelque chose...
    Aménofis parle de 2 valeurs seulement, pour la colonne "Absent", nuance

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut Escartefigue.

    Voici ce que dit Amenofis :
    Citation Envoyé par Amenofis
    J'ai une case à cocher qui reprend le champ "Absent" qui a la valeur 1 si l'enregistrement de T1 est absent et 0 si il est présent, le tout en liste dans un composant TdbCtrlGrid...
    S'il parle de cela, ce n'est pas juste pour faire joli mais pour nous indiquer que cela est en relation avec la colonne ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ISNULL(T2.Index) AS Absent,
    Donc tu peux déduire par la suite sur le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ((ISNULL(T2.Index)=0) OR (ISNULL(T2.Index)=:Visu))
    que le paramètre "visu" prend soit la valeur "0" ou la valeur "1". Pourquoi ?
    Car la fonction "isnull()" retourne que deux valeurs qui sont justement "0" ou "1".

    Et pour revenir à son commentaire ci-dessus, Amenofis met le résultat de la case à cocher avec le paramètre "visu".
    Donc on peut déduire que "visu" prend soit la valeur "0" soit la valeur "1" et rien d'autre.

    Si tu tiens compte de ce que je viens de d'écrire, tu peux comprendre ma remarque précédente.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Que isnull renvoie 0 ou 1 'est pas un scoop, mais rien à voir puisque le isnull est fait sur la colonne "INDEX" avec un alias "ABSENT" pas sur la colonne "ACTIF"
    Or INDEX et ACTIF sont 2 colonnes différentes de la table T2, la preuve par l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
       T1.Ind_TypoRisq,
       T1.Txt_TypoRisq AS Risque,
       T2.Index,
       ISNULL(T2.Index) AS Absent,
       T2.Ind_DU,   
       T2.Ind_WU,
       T2.Actif  
    FROM  zt_typorisq AS T1
    LEFT JOIN
     t_risqdu as T2 ON 
     . . .
    il ne faut donc pas préjuger du contenu d'une colonne "actif" dont on ne connait pas le contenu

    Donc soit il y a d'autres valeurs que 0 et 1auquel cas il faut remplacer le OR par le between comme je le propose
    Soit il n'y a que 2 valeurs, auquel cas pourquoi avoir mis un filtre inutile, ou alors amenofis n'était pas bien reveillé, après tout c'est possile, mais je n'ai pas tendance d'emblée à privilégier cette hypothèse.

    Seul amenofis peut confirmer,

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut Escartefigue.

    Oups ! J'étais complètement focalisé sur la colonne t2.index.
    Oui, en effet, on ne sait rien au sujet de la colonne t2.actif.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 10h44

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