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

MS SQL Server Discussion :

Utilisation des alias dans la clause WHERE d'une requête SELECT


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Par défaut Utilisation des alias dans la clause WHERE d'une requête SELECT
    Bonjour,

    Je ne suis pas une flèche en SQL et j'ai besoin d'un coup de pouce pour le problème suivant:

    J'ai une requête SELECT de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ...maTable1.maDonnée1 AS monAlias... FROM maTablePrincipale WHERE ...monAlias LIKE '%TexteRecherché%'...
    Malheureusement la requête n'est pas valide car dans la clause WHERE le champ monAlias n'est pas reconnu (SQL Server renvoi une erreur Invalid column name 'monAlias').

    Bien sûr, si je remplace monAlias par maTable1.maDonnée1 dans la clause, cela fonctionne. Le problème c'est que la requête est générée dynamiquement et qu'au moment de la génération du WHERE je n'ai connaissance que du paramètre monAlias, pas de maTable1.maDonnée1.

    Y a t'il un moyen d'utiliser les alias dans cette clause, ce qui m'éviterais de faire une analyse syntaxique de ma propre requête pour effectuer manuellement les remplacements de chaînes car ce traitement serait coûteux en performance et je préfèrerais l'éviter.

    Pour info j'utilise SQL Serveur 2005.

    Merci de m'avoir lu.

  2. #2
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    C bizarre, en effet, as-tu essayé d'enlever le AS !! Moi je ne le mettais pas sous SQLPlus

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Par défaut
    Ça ne change rien (en fait l'analyseur syntaxique de SQL Serveur remet automatiquement une forme maTable1.maDonnée1 monAlias en maTable1.maDonnée1 AS monAlias)

    En passant le problème ne se pose que dans la clause WHERE (pas dans le ORDER BY), j'ai donc corrigé le post en conséquence.

  4. #4
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    Est-ce que maTable1.maDonnée1 est un champ texte ? Pour l'utilisation du like !!

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Par défaut
    Oui oui, le problème ne vient pas du LIKE, n'importe quel autre opérateur produit la même erreur.

    Le problème vient de monAlias qui n'est reconnu nulle part dans la clause WHERE.

  6. #6
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    Non mais je te demandais cela car, si ce n'était pas un champ texte le like ne marcherais pas !! Mais bon dans ce cas ...
    Est-tu sur de pouvoir utiliser les alias avec SQL Serveur 2005 ?

    Moi j'utilise SQLPlus, ou Oracle et cela fonctionne mais la je t'avoue que je ne sais pas

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut
    Bonjour, je relance ce topic car j'aurai besoin d'une réponse. Merci d'avance

    Alors j'ai une requête de ce type là...afin de créer une view

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAST(monChamps AS datetime) AS startDate
    FROM maTable
    WHERE startDate > current_timestamp

    Il se trouve qu'il y a ce msg d'erreur avec : invalid column name...jusqu'à maintenant j'utilisais le nom de la colonne et non l'alias...mais là j'ai une expression et je n'ai pas le choix. J'ai une solution : c'est de créer une autre view qui fait référence à cette première view. Mais y a-t-il un moyen de faire cette opération en ne créant qu'une seule view ?!?

    Thx

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Un alias de colonnes ne sert qu'à l'affichage. En aucun cas vous ne pouvez vous en servir dans une clause JOIN, WHERE ou HAVING. En effet, la donnée n'est pas connue au sein de la table.

    Notez qu'en matière de base de données la notion de "champ" n'existe pas. Lisez ce que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L2

    A
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut
    Merci pour ton éclaircissement ! Je n'utiliserai dorénavant plus le mot "champs" pour désigner une colonne !!!


    Par contre ma question subsiste (message #7) :

    1ère Requête pour créer : view_1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CAST(columnName AS datetime) AS startDate
    FROM tableName
    2ème Requête pour créer :view_2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT startDate
    FROM view_1
    WHERE startDate > current_timestamp
    Il n'y a pas de solution pour sélectionner ces données désirées en une seule view ???

    Merci

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAST(columnName AS datetime) AS startDate
    FROM tableName
    WHERE CAST(columnName AS datetime) > CURRENT_TIMESTAMP
    Tout simplement !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut
    Ah ouais tout simplement.....

    Ok alors merci pour toutes ces précisions et peut-être à une prochaine!

  12. #12
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Par défaut
    Bonjour a tous,

    Je relance cette discussion parce que j'ai le même problème. J'ai un champ avec un accent que je ne peut modifier parce qu'il est relié a une application Visual basic. Du coup j'ai créé un alias dans ma requête, mais j'ai besoin de faire un where avec ce champ la, je sais pas comment le faire avec un alias
    J'ai ecris ca comme code:

    Pour la récupération de mon champs avec alias
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     //sélection des designation produits dans la table produit
     
    $resQuery1=mssql_query("SELECT [Désignation Produit] As [Designation Produit] FROM Produits");
    Et ce code la pour sélectionner tous autres éléments qui correspondent a la désignation choisis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(isset ($_GET["designation"])){
    echo"<option value='' selected='selected'>".$_GET["designation"]."</option>";
    $research1="WHERE [Designation Produit] ='".$_GET["designation"]."'";}
    if(isset ($research1)){
    $req1=mssql_query("SELECT * FROM produits ".$research1);}
    $allLine1=@mssql_num_rows($req1);

  13. #13
    Membre expérimenté
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Par défaut
    Si vous êtes vraiement obligés vous pouvez forcer la reconnaissance de l'alias en faisaint une table temporaire et le WHERE sur la "meta-requête" si vous comprenez ma lexique bizarre. Voici ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    	[Designation Produit]
    FROM (SELECT
    	[Désignation Produit] AS [Designation Produit]
    FROM Produits) AS Prod_Temp
    WHERE [Designation Produit] = 'Text'

  14. #14
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Par défaut
    Il suffit de mettre le nom de la colonne et non de l'alias dans la clause WHERE, vous le connaissez puisqu'il est déclarée dans la clause SELECT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     //sélection des designation produits dans la table produit
     
    $resQuery1=mssql_query("SELECT [Dsignation Produit] As [Designation Produit] FROM Produits");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(isset ($_GET["designation"])){
    echo"<option value='' selected='selected'>".$_GET["designation"]."</option>";
    $research1="WHERE [Désignation Produit] ='".$_GET["designation"]."'";}
    if(isset ($research1)){
    $req1=mssql_query("SELECT * FROM produits ".$research1);}
    $allLine1=@mssql_num_rows($req1);

  15. #15
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Le plus propre aurait été de créer une vue ou une procédure stockée

    @++

Discussions similaires

  1. [Oracle] utilisation des alias dans le where
    Par seddik_saber dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/09/2007, 11h18
  2. Réponses: 2
    Dernier message: 29/01/2007, 13h41
  3. Réponses: 3
    Dernier message: 18/09/2006, 20h55
  4. Réponses: 4
    Dernier message: 10/05/2006, 18h40
  5. Ordre des tests dans la clause WHERE
    Par Tans98 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/09/2004, 10h52

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