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

Requêtes PostgreSQL Discussion :

requete filtrée avec WHERE


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre averti
    Homme Profil pro
    Informaticien
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 357
    Points
    357
    Par défaut requete filtrée avec WHERE
    Bonjour à tous,

    Voici mon problème

    j'ai une table avec une colonne caractère "code" et une colonne caractère "resultat"
    Suivant le code la colonne "resultat" peut être renseignée par du numérique ou de l'alpha

    Pour des besoins statistiques sur les données numériques j'ai essayé de filtrer les données de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT code,COUNT(resip_resultat) as res FROM 
    WHERE code='01'  AND CAST(TRIM(resultat) AS INTEGER)<=200;
    (lorsque code='01' il s'agit exclusivement de données numériques)

    cela a retourné une erreur de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERREUR:  syntaxe en entrée invalide pour le type integer : « BLABLA »
    (blabla étant une donnée caractère stockée dans resultat)

    j'ai donc essayé de filtrer par une sous-requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT  code,res FROM
    (SELECT code,COUNT(resip_resultat) AS res FROM 
    WHERE code='01') as sreq1 
    WHERE  CAST(TRIM(res) AS INTEGER)<=200;
    et j'ai de nouveau la même erreur.

    comment cela se fait t'il, la sous requête n'aurait-elle pas dû enlever les données alpha ?

    Merci pour vos suggestions.

    Cordialement,
    Rupteur

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour un truc du style (en utilisant les expressions rationnelles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where resultat~'^[0-9]+$' and resultat::numeric=<200

  3. #3
    Membre averti
    Homme Profil pro
    Informaticien
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 357
    Points
    357
    Par défaut
    Merci beaucoup, cela fonctionne parfaitement !

    je ne comprends pas pourquoi postgresql évalue les sous-requêtes de cette façon,
    mais puisqu'il existe un moyen de faire autrement

  4. #4
    Membre émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    Si la méthode que tu cites initialement ne fonctionne pas, c.a.d:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE code='01'  AND CAST(TRIM(resultat) AS INTEGER)<=200
    alors on peut difficilement croire que l'autre méthode serait meilleure, à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE resultat~'^[0-9]+$' AND resultat::numeric=<200
    car les deux procèdent exactement de la même logique qui pose problème.

    Problème parce que ça suppose que la condition à gauche du AND va être évaluée avant celle de droite, alors qu'il n'y a aucune garantie que ce soit le cas.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par rupteur Voir le message
    Merci beaucoup, cela fonctionne parfaitement !

    je ne comprends pas pourquoi postgresql évalue les sous-requêtes de cette façon,
    mais puisqu'il existe un moyen de faire autrement
    PostGreSQL dispose d'un optimiseur qui a encore beaucoup de chemin à faire pour rejoindre celui des grands SGBDR.

    Jetez un coup d'œil a l'article que j'ai écrit à ce sujet :
    http://blog.developpez.com/sqlpro/p5...lle-intellige/
    A ma connaissance seul SQL Server en est capable... Mais je n'ai pas testé sous IBM DB2 !

    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/ * * * * *

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

Discussions similaires

  1. [PDO] Requete erronée avec Where
    Par EvaristeGaloisBis dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/06/2015, 11h20
  2. requete Select avec WHERE OR
    Par hugodu28 dans le forum Langage
    Réponses: 2
    Dernier message: 11/07/2012, 18h51
  3. syntaxe requete insert avec where
    Par maub85 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 18/01/2012, 09h03
  4. requete SQL avec where dynamique dans une servlet
    Par Mickael Scofild dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/08/2007, 12h05
  5. Probleme requete Mysql avec WHERE
    Par Dom_the_quaker dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/10/2005, 16h21

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