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

Langage SQL Discussion :

SQL vers expression booléenne


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut SQL vers expression booléenne
    Hello les gens,
    Je ne suis pas certain de poster au bon endroit mais si je peux avoir une réponse sur le forum c'est bien sur celui d'SQL j'espère.

    Voila j'ai une requête avec des conditions qui devraient être dans le where et j'aurais aimé convertir la condition un peu à la manière où un :
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Not A) or B) AND (A or C)
    Mes conditions à moi seraient plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF (P_V_TYPE='DAOPCVM') THEN ( (YEAR(TIME_REQUEST)= L_I_ANNEE_DAOPCVM AND HEADER.TYPE='DAOPCVM') OR (YEAR(DATE_H)= L_I_ANNEE_DAOPCVM AND HEADER.TYPE='DA'))
    ELSE IF (P_V_TYPE='DA') THEN ((YEAR(DATE_H)= L_I_ANNEE AND HEADER.TYPE='DA') OR (YEAR(TIME_REQUEST)= L_I_ANNEE AND HEADER.TYPE='DAOPCVM'))ELSE (YEAR(DATE_H)= L_I_ANNEE AND SUBSTR(HEADER.TYPE , 1, 2)=SUBSTR(P_V_TYPE , 1, 2))
    Ce qui pourrait être simplifié en IF A THEN B ELSE IF C THEN D ELSE E
    Ce qui devient alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (not A or B) and (A or ((not C or D) and (C or E)))
    J'ai tout bon ?

    Merci pour toutes vos contributions.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Pourquoi ne pas plutôt utiliser CASE qui est fait pour ça?

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Apparement le case n'est pas:
    - portable
    - rapide (en comparaison avec une expression booléenne)
    - maintenable

  4. #4
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Citation Envoyé par jadey Voir le message
    Apparement le case n'est pas:
    - portable
    - rapide (en comparaison avec une expression booléenne)
    - maintenable
    Ah bon ?
    - portable ... Qu'est ce que vous appelez portable exactement ?
    car CASE WHEN fait partie intégrante de SQL92 (Cf BNF Grammar for ISO/IEC 9075:1992 - Database Language SQL (SQL-92)), vous le trouverez sur la pluspart (voir meme l'intégralité) des SGBD.
    -Rapide : Je n'ai a vrai dire jamais eu la curiosité d'analyser la différence de plan d'execution entre un CASE WHEN et une tripoté d'expressions booleennes, ca vaudrait le coup d'y jeter un oeil, mais j'ai de gros doute sur le fait que cela soit moins rapide.
    - Maintenable : Cela dépend beaucoup de votre facon de coder ...

    Vous definissez

    Je l'aurai ecrit genre : (A.B) + (!A.C)
    (A and B) or (not A and C)

    Du coup, votre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF A THEN B ELSE IF C THEN D ELSE E
    Je l'aurai ecrit genre (A.B) + (C.D) + !((A.B) + (C.D)) . E

    Ce qui est quand meme beaucoup moins lisible qu'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE 
       WHEN A THEN B
       WHEN C THEN D
       ELSE E
       END
    Sans compter du temps passer a chercher a régulariser vos expressions booléennes, a tester leur table de vérités, et en terme de maintenance, j'aimerai bien voir ce que vous ferez lorsqu'il faudra rajouter une autre condition...

    A vous de voir

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Citation Envoyé par jadey Voir le message
    Apparement le case n'est pas:
    - portable
    - rapide (en comparaison avec une expression booléenne)
    - maintenable
    Je dois dire que l'argument de la maintenabilité est assez savoureux. Personnellement si je rencontrais cet enchevêtrement de OR, AND et NOT je pense qu'il me faudrait bien 15-20mn pour comprendre avec certitude ce que ça fait.
    Et si c'est pour se rendre compte au final que c'est l'équivalent d'un CASE que j'aurais compris en 3 secondes, je peux dire que j'aurais de solides doutes sur la volonté du programmeur de l'avoir fait exprès pour rendre son code illisible

  6. #6
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    Pour ceux qui voudraient approfondir le sujet et polémiquer dessus:
    http://weblogs.sqlteam.com/jeffs/arc...11/14/513.aspx
    Ce qui n'est absolument pas le but de ce post. Merci.

  7. #7
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Nous avons le droit de donner une opinion sur ce que vous cherchez a faire, puisque vous postez pour cela ?

    Votre lien devoile une facon de penser et donc de coder (qui je pense ne convient deja pas a votre exemple car il s'agit de test binaire et vous etes sur un test a 3 etats) qui ne me convainc pas.

    Maintenant si nos réponses sont trop polémiques, peut etre vaut il mieux poster votre demande sur le blog en question ...

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/11/2008, 11h54
  2. Convertir un fichier DAT de SQL 6.5 vers SQL 2005 express
    Par dob2806 dans le forum Administration
    Réponses: 4
    Dernier message: 16/06/2008, 15h05
  3. Réponses: 13
    Dernier message: 08/05/2007, 09h22
  4. De MySql vers SQL Server Express
    Par Sami Xite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/03/2007, 17h41
  5. [SQL 2005 Express] Déplacer une base vers un autre serveur
    Par joKED dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2006, 17h37

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