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][DB2]désigner une colonne dans le WHERE par son indice?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 93
    Points : 61
    Points
    61
    Par défaut [SQL][DB2]désigner une colonne dans le WHERE par son indice?
    Bonjour,

    j'aurai voulu savoir si il était possible dans une requête de sélection de désigner une colonne dans la clause Where par son indice :

    ex: table EMPLOYE(ID,NOM,PRENOM)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE
    Where 2 like '%Dupont%'
    Order by 2;
    merci.

  2. #2
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Salut

    J'ai fouillé dans le RedBook d'IBM et j'ai rien trouvé là-dessus.

    C'est quoi la raison de vouloir changer un nom de colonne?

  3. #3
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonsoir,

    Ca semble difficilement possible.
    Comment traduirais-tu
    WHERE nom = 2
    par exemple ?
    table.colonne = 2 (la valeur) ?
    ou bien
    table.colonne = colonne n° 2 de ton résultat ?
    Déjà qu'avec 1
    ORDER BY 2,5,1,...
    on arrive à mettre la tawa...J'imagine le résultat d'1
    SELECT *
    FROM T1, T2, T3
    WHERE 1 = 1
    AND 2 = 3
    AND 2 = 4
    ORDER BY 49,10,8 !!!!

  4. #4
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Citation Envoyé par TheLeadingEdge
    on arrive à mettre la tawa...J'imagine le résultat d'1
    SELECT *
    FROM T1, T2, T3
    WHERE 1 = 1
    AND 2 = 3
    AND 2 = 4
    ORDER BY 49,10,8 !!!!
    Bien expliqué! Y'aurait de quoi virer maboule

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    on arrive bien à faire des ORDER BY 1,2 ....

    Ce serait utile par exemple lorsque l'on veut faire une recherche multi-critéres (si je reprend mon premier exemple) avec une seule requête pour rechercher dans le nom de l'employé ou le prénom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE 
    Where 2 like '%Dupont%' 
    Order by 2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE 
    Where 3 like '%Jean%' 
    Order by 3;
    dans ce cas , on se retrouve avec une unique requête à 2 paramètres et cela quelque soit le nombre de colonnes de la table et cela sans se soucier du nom des colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE 
    Where @Param1 like '%@Param2%' 
    Order by @Param1;
    plutôt que d'avoir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE
    WHERE NOM like '%@Param1%'
    Order by NOM;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE
    WHERE PRENOM like '%@Param1%'
    Order by PRENOM;
    on imagine maintenant un champ supplémentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE
    WHERE DESCRIPTION like '%@Param1%'
    Order by DESCRIPTION;
    On se retrouve avec 3 requêtes, alors que dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * FROM EMPLOYE 
    Where @Param1 like '%@Param2%' 
    Order by @Param1;
    une seule requête suffit (et ceux quelque soit le nombre de colonne).

    Ah lala, le SQL est vraiment un langage sommaire

    et bien tant pis, j'utiliserai les noms de colonnes comme paramètres (@Param1) ce qui rendra mon programme C# très dépendant de la base de données.

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Nycos62
    Ah lala, le SQL est vraiment un langage sommaire
    Sommaire, non, rigoureux, oui

    La syntaxe du type "SELECT *" est en général déconseillée car elle ne permet pas d'optimiser les requêtes, et il est clair qu'il est impossible dans un tel cas d'utiliser le n° du champ dans ta clause "Order By", vu que c'est le fait de préciser les champs dans le SELECT qui permet de les "numéroter". Même si tu as créé ta table avec un script bien précis, l'ordre dans lequel sont créés les champs n'a aucune signification en SQL.


    Citation Envoyé par Nycos62
    et bien tant pis, j'utiliserai les noms de colonnes comme paramètres (@Param1) ce qui rendra mon programme C# très dépendant de la base de données.
    Ha, rien à voir, à mon avis ! Si tu dois implémenter une recherche multi-critères, il te faut contruire ta requête dans ta GUI, en fonctions de scritères renseignés : c'est de la simple concaténation de chaînes de caractères
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Xo
    simple concaténation de chaînes de caractères


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'SQLCommand
    SqlCommand commad = New SqlCommand("SELECT * FROM EMPLOYE WHERE " + _
                                               "@colonne like '%@nomemp%' ORDER BY @colonne", _
                                               connection)
    'Paramètres
    command.Parameters.Add(New SqlParameter("@nomemp", SqlDbType.VarChar, 20))
    command.Parameters("@nomemp").Value = "DUPONT"
    command.Parameters.Add(New SqlParameter("@colonne", SqlDbType.VarChar, 20))
    command.Parameters("@colonne").Value = "NOM"
    le problème en fait était un soucis d'indépendance optimale du code et du schéma physique des données en base :

    On sait compter le nombre de colonnes d'une table => ce qui permet d'extraire du programme les noms de colonnes en les désignant par leur numéro. Mais malheureusement çà n'est pas possible.
    Ensuite, je me suis rappelé que l'on pouvait lister les noms de colonne d'une table, donc au final => les valeurs possibles de l'attribut @colonne sont tout de même externalisées et la seule valeur à indiquer dans le programme sera le nom de la table.

    (par contre, je ne pensais pas qu'un SELECT * était moins performent qu'un SELECT ID,NOM,PRENOM)

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/10/2014, 14h38
  2. Réponses: 0
    Dernier message: 13/04/2012, 17h57
  3. [sql 2005]: changer le nom d'une colonne dans un table
    Par TheLittle dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/06/2006, 15h29
  4. ajout d'une colonne dans une requete SQL
    Par fscli dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/05/2006, 14h59
  5. [SQL] Somme de 2 colonnes dans une même table
    Par Cyrilange dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/04/2005, 08h32

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