Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/08/2011, 16h12   #1
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
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 :
((NOT A) OR B) AND (A OR C)
Mes conditions à moi seraient plutôt:
Code :
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 :
(NOT A OR B) AND (A OR ((NOT C OR D) AND (C OR E)))
J'ai tout bon ?

Merci pour toutes vos contributions.
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 14h47   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Pourquoi ne pas plutôt utiliser CASE qui est fait pour ça?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2011, 15h00   #3
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
Apparement le case n'est pas:
- portable
- rapide (en comparaison avec une expression booléenne)
- maintenable
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 15h33   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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 :
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 :
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
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2011, 17h52   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/08/2011, 11h59   #6
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
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.
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 12h55   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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 ...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/08/2011, 14h29   #8
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
Citation:
Nous avons le droit de donner une opinion
Surement, mais tu comprendras ma réticence à y donner suite pour éviter de dévier du sujet initial.
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h06   #9
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Citation:
Voila j'ai une requête avec des conditions qui devraient être dans le where
Pourquoi devraient elles etre dans le where, ou sont elles pour l'instant ?
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 23h14   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
je rajouterai simplement qu'au niveau des perfs ...si dans vos expression booléenne vous avez de jolie substring, like... ca risque de devenir marrant très vite (scannage de table presque obligatoire, je dis "presque" car vous pouvez selon le sgbd implémenter des index spécifique ).

Bref je testerai par deux fois les deux solutions avant d'avoir un avis tranché sur la question..
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 12h23   #11
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
Cette "manière de faire" répond actuellement à mon besoin après tests. Merci pour tout vos conseils.
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h07.


 
 
 
 
Partenaires

Hébergement Web