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 :

syntaxe du decode


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 40
    Points
    40
    Par défaut syntaxe du decode
    Bonjour a tous,

    J'ai un petit soucis sur une requete :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select distinct tc1.toto_id
    from temp_corresp tc1, temp_corresp tc2, toto_caracteristique ac, toto a, toto a2
    where tc1.code=tc2.code
    and a.ID=tc1.toto_ID
    and a2.ID=tc2.toto_ID
    and a.titi_id=a2.titi_id
    and tc1.toto_id != tc2.toto_id
    and tc1.INDICE='A' and tc2.INDICE='A'
    and ac.CODE=tc1.CODE
    and ((a.FONCTION_ID=ac.FCTTOTO) or (ac.FCTTOTO='XXX'))
    and ac.IND_DOUBLON=0;
    L'idee est qu'il faudrait que si a.FONCTION_ID=ac.FCTTOTO alors ma requete serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select distinct tc1.toto_id
    from temp_corresp tc1, temp_corresp tc2, toto_caracteristique ac, toto a, toto a2
    where tc1.code=tc2.code
    and a.ID=tc1.toto_ID
    and a2.ID=tc2.toto_ID
    and a.titi_id=a2.titi_id
    and tc1.toto_id != tc2.toto_id
    and tc1.INDICE='A' and tc2.INDICE='A'
    and ac.CODE=tc1.CODE
    and a.FONCTION_ID=ac.FCTTOTO
    and ac.IND_DOUBLON=0;
    sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select distinct tc1.toto_id
    from temp_corresp tc1, temp_corresp tc2, toto_caracteristique ac, toto a, toto a2
    where tc1.code=tc2.code
    and a.ID=tc1.toto_ID
    and a2.ID=tc2.toto_ID
    and a.titi_id=a2.titi_id
    and tc1.toto_id != tc2.toto_id
    and tc1.INDICE='A' and tc2.INDICE='A'
    and ac.CODE=tc1.CODE
    and ac.FCTTOTO='XXX'
    and ac.IND_DOUBLON=0;

    J'ai essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select count (distinct tc1.toto_id)
    from temp_corresp tc1, temp_corresp tc2, toto_caracteristique ac, toto a, toto a2
    where tc1.code=tc2.code
    and a.ID=tc1.toto_ID
    and a2.ID=tc2.ADV_ID
    and a.titi_id=a2.titi_id
    and tc1.toto_id != tc2.toto_id
    and tc1.INDICE='A' and tc2.INDICE='A'
    and ac.CODE=tc1.CODE
    and ac.IND_DOUBLON=0
    and decode (ac.FCTTOTO,a.FONCTION_ID,ac.FCTTOTO,'XXX');

    mais ca renvoie une erreur.

    Si quelqu'un avait une idee ...

    Merci d'avance

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    bonjour,

    quelle est l'erreur renvoyée?

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    DECODE n'existe pas en SQL. SQL est un langage normalisé et chaque éditeur Prend plus ou moins de liberté avec la norme. En particulier Oracle est très anormatif, et le DECODE est spécifique à Oracle. Votre demande aurait donc mieux sa plae sur le forum spécialisé Oracle.

    Maintenant la norme c'est CASE, mais Oracle ne supporte pas le CASE avant une certaine version d'Oracle.

    Or comme tu ne nous a pas donnée ni ton SGBDR, ni sa version, difficile de t'en dire plus.

    Le CASE : http://sqlpro.developpez.com/cours/sqlaz/select/#L7

    A +

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 40
    Points
    40
    Par défaut
    erreur : 00920 invalid relationnal operator

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 40
    Points
    40
    Par défaut
    Desole, le sgbd c'est oracle 1Og

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Tu n'as pas de paramètre en entrée dans tes fonctions ?
    Ca ne m'est jamais arrivé, donc quand j'appelle une fonction, elle est suivie de parenthèses encadrant les paramètres.
    Est-ce qu'il ne faudrait pas que tu mettes ces parenthèses () pour signifier que c'est une fonction ?

  7. #7
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu as oublié de spécifier la valeur retournée par défaut. Exemple :
    DECODE(jour,'samedi','S','dimanche','D','jour en semaine')
    En gros si jour vaut 'samedi' ça retourne 'S', sinon si jour vaut 'dimanche' ça retourne 'D', sinon ça retourne 'jour en semaine'
    C'est expliqué dans la doc officielle Oracle ici

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 40
    Points
    40
    Par défaut
    decode (ac.FCTTOTO,a.FONCTION_ID,a.FONCTION_ID,'XXX')

    Je ne sais pas s'il manque une valeur , d'apres ce que je comprends, la si ac.fct est egal a a.fonction_id alors ac.fct= fonction_id sinon par defaut c'est 'XXX' mais en fait je ne sais meme pas si c'est bien de cette facon qu'il faudrait coder cette requete, mon but serait que si ac.fct= fonction_id renvoie vrai alors on a la requete select from where ... and ac.fct= fonction_id sinon une requete du style select from where ... and ac.fct='XXX'

  9. #9
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    autant pour moi j'avais mal vu ta requête, effectivement syntaxiquement c'est bon alors

  10. #10
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    le problème c'est que sur la ligne du decode, il manque un opérateur de comparaison, car decode renvoie une valeur

    regarde du côté des jointures externes, je pense que ça peut répondre à ton problème

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and decode (ac.FCTTOTO,a.FONCTION_ID,ac.FCTTOTO,'XXX');
    LE DECODE est une fonction et renvoie une valeur, ce n'est pas une condition en soi (en tout cas dans Oracle).
    Donc ici, c'est comme si tu écrivais :
    select ... from... where...
    and 1;
    Ce que tu pourrais faire (si j'ai compris ce que tu souhaite):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode (ac.FCTTOTO,a.FONCTION_ID,1,'XXX',1)=1
    Citation Envoyé par scheu
    Tu as oublié de spécifier la valeur retournée par défaut.
    Non, on n'est pas obligé de spécifier la valeur par défaut. Si on ne met rien, alors le DECODE renvoi Null (si la comparaison n'est pas vérifiée).

Discussions similaires

  1. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 13h53
  2. Syntaxe requete
    Par Chipolata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/03/2003, 15h22
  3. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 21h20
  4. Syntaxe TASM <-> MASM
    Par LFC dans le forum Assembleur
    Réponses: 3
    Dernier message: 28/02/2003, 16h56
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 16h33

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