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

PostgreSQL Discussion :

Simplifier une requête


Sujet :

PostgreSQL

  1. #1
    Membre éclairé
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Par défaut Simplifier une requête
    Bonjour ,

    Je cherche à filtrer une table sur un champ texte qui doit remplir une des conditions suivantes :

    - null
    - '' ( quote,quote )
    - 1 ou plusieurs blancs

    J'en suis à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE monchamp is null or replace(monchamp, ' ' , '') = ''
    Peut-on encore simplifier ?

    Merci de vos avis éclairés !

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,


    Non.

    Peut être qu'un trim sera plus efficace qu'un replace, à tester.

  3. #3
    Membre éclairé
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Par défaut
    Merci pour la réponse.

    En fait j'avais essayé avec trim , mais il travaille sur le "début, de la fin ou des deux extrémités" d'une chaine , mais pas sur le milieu de la chaîne.

    Ce que je voulais c'était me passer du 'OR' ,

    .. peut-être avec une regex ? ...

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Citation Envoyé par jeanphi45 Voir le message
    Merci pour la réponse.

    En fait j'avais essayé avec trim , mais il travaille sur le "début, de la fin ou des deux extrémités" d'une chaine , mais pas sur le milieu de la chaîne.

    Ce que je voulais c'était me passer du 'OR' ,

    .. peut-être avec une regex ? ...
    Euh ???
    Sur le début ou la fin oui, mais puisque vous cherchez une chaine vide quand on supprime les espaces, ça veut dire que la chaine est constituée uniquement d'espaces.
    Donc trim fait parfaitement l'affaire...

  5. #5
    Membre éclairé
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Par défaut
    ah oui c'est vrai !

    et sinon , si on veut se passer du OR ?

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    ça n'a pas vraiment d'intérêt, mais vous pouvez faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE trim(COALESCE(monchamp, '')) = ''
    Je ne sais pas si en Postgre SQL c'est la fonction "COALESCE" aussi, mais vous devez avoir une fonction du genre qui remplace les "null" par la valeur souhaitée

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    C'est aussi complexe.

    Votre requête n'est pas simplifiable.

    Elle l'aurai été si vous ne donniez pas la possibilité de stocker des NULL.


    NULL n'est pas une valeur mais l’absence d'une valeur.
    De ce fait le seul moyen de tester cet état est l'utilisation d'un IS (NOT) NULL.

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Citation Envoyé par punkoff Voir le message
    C'est aussi complexe.
    C'est pour ça que je dis que ça n'a pas vraiment d'intérêt.

    Après il peut faire des tests d’exécution voir laquelle méthode est la plus rapide si son soucis était un soucis de temps d'exécution.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Tiens,

    j'me disais bien que cette discussion me rappelai quelque chose :
    http://www.developpez.net/forums/d12...ifier-requete/


    Quel est le réel problème sous-jacent ?

  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 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Pour des raisons de performances, vous fériez sans doute mieux de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *
    FROM   maTable
    WHERE  MaColonne IS NULL
    UNION ALL
    SELECT *
    FROM   maTable
    WHERE  MaColonne = ''
    UNION ALL
    SELECT *
    FROM   maTable
    WHERE  MaColonne LIKE ' %'
      AND  MaColonne = REPEAT(' ', CHARACTER_LENGTH(MaColonne));
    En effet, dans ce cas, tous les prédicats de la clause WHERE des différentes composantes des ordres SELECT sont sragable.
    À me lire : http://blog.developpez.com/sqlpro/p1...ql-sargable-c/

    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
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    On pourrait aussi conseiller de mettre en place un CHECK pour ne pas avoir NULL, chaine vide et espaces permis. Avec une modification des données existantes au préalable.

    Apparemment il n'y a aucun besoin de distinguer ces différentes possibilités au départ, autant faire en sorte que la base ne le permette pas et qu'il ne reste plus qu'un cas "vide" à tester.

    On gagnera en perfs et en lisibilité des requêtes.

  12. #12
    Membre actif
    Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Par défaut nvl
    sur oracle on n'a plus qu'une condition avec un nvl + replace.

Discussions similaires

  1. [MySQL] Simplifier une requête
    Par eldorplus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/05/2011, 10h02
  2. [MySQL] Simplifier une requête SQL
    Par maestro982 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/05/2010, 13h26
  3. [MySQL] Simplifier une requête
    Par novphp dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 31/01/2009, 12h18
  4. simplifier une requête avec des 'OR'
    Par Spaccio dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/05/2008, 10h06
  5. [SQL] Simplifier une requête SQL ?
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/04/2006, 13h50

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