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 :

Tester la casse à la saisie


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut Tester la casse à la saisie
    Bonjour,

    Dans une table, j'ai un champ varchar(), je voudrais mettre une contrainte que tous les caractères saisis soient des majuscules. idem dans un autre champ : je voudrais que la première lettre soit une majuscule, et toutes les suivantes soient minuscules.

    J'imagine qu'il faut écrire une procédure stockée, ou quelque chose comme ça, mais comment faire ?
    Je suis sous postgreSQL.

    Merci,
    Nico

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Le contrôle de saisie vous devriez le faire au niveau de votre application.
    La base de données va contrôler cette règle via une contrainte CHECK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHECK (colonne = upper(colonne))
    Idem pour la première lettre en majuscule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHECK (colonne = initcap(colonne))
    Maintenant vous pouvez tout à fait laisser la saisie libre, et forcer la casse dans une vue avec ces mêmes fonctions.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    merci pour les syntaxe SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le contrôle de saisie vous devriez le faire au niveau de votre application.
    Pourquoi ?

    Mon idée, c'est que si un jour j'ai un chargement massif de données à faire, au lieu de passer par l'interface, je fais ça par des scripts sql, et donc, il faut qu'il y ait un contrôle de saisie au niveau de la base...
    Mauvais raisonnement ?

    Merci,
    Nico

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    Vous pouvez codez un déclencheur pour ce faire. Exemple :

    La table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE T_TEST (C VARCHAR(16));
    La fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE FUNCTION P_E_I_TEST() 
    RETURNS TRIGGER AS  
    ' 
      BEGIN 
      UPDATE T_TEST
      SET    C = UPPER(C)
      WHERE  C = NEW.C;
      RETURN NULL; 
      END; 
    ' 
    LANGUAGE 'plpgsql';
    Le déclencheur incorporant la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER E_I_TEST
    AFTER INSERT 
    ON T_TEST 
    FOR EACH ROW EXECUTE PROCEDURE P_E_I_TEST ();
    Le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO T_TEST VALUES ('toto')
    La solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM T_TEST
     
    C
    ---------------------------
    TOTO
    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/ * * * * *

  5. #5
    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
    Il n'y a pas à faire d'update dans la fonction, il suffit de faire NEW.C = upper(c) et lier la fonction à un trigger BEFORE, ce sera beaucoup plus efficace.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    SQL-Server ne gère pas les triggers BEFORE.
    Mais sur un SGBD qui les supporte vous avez parfaitement raison, le trigger BEFORE sera la plus performant.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Il n'y a pas à faire d'update dans la fonction, il suffit de faire NEW.C = upper(c) et lier la fonction à un trigger BEFORE, ce sera beaucoup plus efficace.
    J'oublie toujours que PostGreSQL ne sait pas faire des triggers "for each statement" !

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

  8. #8
    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
    Citation Envoyé par SQLpro Voir le message
    J'oublie toujours que PostGreSQL ne sait pas faire des triggers "for each statement" !
    Tu l'oublies à juste titre, puisque c'est faux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    test=> \h create trigger
    Command:     CREATE TRIGGER
    Description: define a new trigger
    Syntax:
    CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
        ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
        EXECUTE PROCEDURE funcname ( arguments )

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    Ah mon dieux, c'est vrai que ça a changé récemment !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 19/01/2008, 16h52
  2. Réponses: 6
    Dernier message: 26/02/2007, 13h43
  3. Réponses: 18
    Dernier message: 15/11/2005, 10h13
  4. tester le type d'une valeur saisie
    Par lalaurie40 dans le forum C
    Réponses: 1
    Dernier message: 09/10/2005, 21h52
  5. [VB.NET] [VS.NET] Tester si le texte saisi est un entier
    Par San Soussy dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 10h41

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