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 :

Requête selon condition


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre éclairé Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Par défaut Requête selon condition
    Bonjour à tous,

    Je voudrais exécuter un ensemble de requêtes UPDATE ou INSERT selon le résultat d'une requête SELECT.

    Je m'explique schématiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SI SELECT ne renvoie rien ALORS
        INSERT
        INSERT
        INSERT
    SINON
        UPDATE
        UPDATE
    FIN
    Voici ce que j'ai écrit pour mes requêtes mais qui pour le moment ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IF (SELECT parts.part_id FROM parts WHERE part_nm = 'test' OR part_nm = 'test **NO STOCK**') = NULL THEN:
    	INSERT INTO parts (part_nm, part_snm, part_category_id, maker_id, maker_ref, unit_id, stock_min, stock_max, is_certificate_needed, is_orderable, comments,drawing_ref) VALUES ('test', 'test', 2, 3981, 'test', 6, 0,9999, 'f', 't', 'test','');
    	INSERT INTO catalog_parts (catalog_id, part_id, catalog_parts_reference, catalog_parts_price, catalog_parts_currency_cd, catalog_parts_activated) VALUES ((SELECT catalog_id FROM catalog WHERE catalog_name = 'test'), (SELECT last_value FROM parts_part_id_seq), 'test', 50, 'EUR', 't');
    	INSERT INTO parts_on_equipments (part_id, equipment_id) VALUES ((SELECT last_value FROM parts_part_id_seq), 1704);
    ELSE:
    	UPDATE catalog_parts SET catalog_parts_price = '50' WHERE catalog_id = (SELECT catalog_id FROM catalog WHERE catalog_name = 'test') AND part_id IN (SELECT part_id FROM parts WHERE part_nm = 'test' OR part_nm = 'test **NO STOCK**');
    	UPDATE parts SET unit_id = 6 WHERE part_nm = 'test' OR part_nm = 'test **NO STOCK**';
    END;
    Savez-vous s'il est possible de faire un truc dans ce genre ?

    Merci d'avance ! m(___)m

    PS: Je dois exécuter un script qui contient entre 5 et 500 fois ce type de condition pour mettre à jour ou ajouter des articles dans une base de données, une fois par semaine (selon un remplissage de fichier Excel d'un client).
    Et pour info, j'utilise le logiciel NAVICAT pour lancer le script.

  2. #2
    Membre Expert
    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
    Par défaut
    L'idiome pour tester si une ligne existe en procédural serait plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF EXISTS (select 1 from ... etc...) THEN...
    A contrario, est toujours faux donc ne sert à rien.

  3. #3
    Membre éclairé Avatar de Romanops
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 278
    Par défaut
    Bonjour et merci pour votre réponse.

    J'ai essayé ce que vous m'avez dit, bizarrement, navicat me renvoie une erreur dès le IF... Je ne comprends pas trop...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IF EXISTS (SELECT parts.part_id FROM parts WHERE part_nm = 'test' OR part_nm = 'test **NO STOCK**') THEN:
    	INSERT INTO parts (part_nm, part_snm, part_category_id, maker_id, maker_ref, unit_id, stock_min, stock_max, is_certificate_needed, is_orderable, comments,drawing_ref) VALUES ('test', 'test', 2, 3981, 'test', 6, 0,9999, 'f', 't', 'test','');
    	INSERT INTO catalog_parts (catalog_id, part_id, catalog_parts_reference, catalog_parts_price, catalog_parts_currency_cd, catalog_parts_activated) VALUES ((SELECT catalog_id FROM catalog WHERE catalog_name = 'test'), (SELECT last_value FROM parts_part_id_seq), 'test', 50, 'EUR', 't');
    	INSERT INTO parts_on_equipments (part_id, equipment_id) VALUES ((SELECT last_value FROM parts_part_id_seq), 1704);
    ELSE:
    	UPDATE catalog_parts SET catalog_parts_price = '50' WHERE catalog_id = (SELECT catalog_id FROM catalog WHERE catalog_name = 'test') AND part_id IN (SELECT part_id FROM parts WHERE part_nm = 'test' OR part_nm = 'test **NO STOCK**');
    	UPDATE parts SET unit_id = 6 WHERE part_nm = 'test' OR part_nm = 'test **NO STOCK**';
    END;
    [Err] ERROR: syntax error at or near "IF"
    LINE 1: IF EXISTS (SELECT parts.part_id FROM parts WHERE part_nm = '...

  4. #4
    Membre Expert
    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
    Par défaut
    IF-THEN-ELSE n'existe pas en langage SQL. Le SQL ne connait que SELECT ou UPDATE ou DELETE etc...

    Tout le bloc ci-dessus est du langage procédural plpgsql, il doit être placé soit dans une fonction, soit dans un bloc DO.

    Sinon IF se terminera par END IF, pas par END. D'une manière plus générale la syntaxe ne s'invente pas, il faut programmer avec la doc sous les yeux.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ces requêtes conditionnelles ne sont pas du SQL pur, elles existent toutefois dans l'extension PL/pgSQL.

    Il faut passer par un bloc DECLARE BEGIN END :
    http://postgresql.developpez.com/doc...structure.html

    Edit : grillé par estofilo !

Discussions similaires

  1. Requête paramétrée, variable selon conditions
    Par GoustiFruit dans le forum Bases de données
    Réponses: 11
    Dernier message: 22/01/2012, 14h09
  2. [HTML][CSS] Redimensionner une image selon condition
    Par Eilkh dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/02/2006, 15h55
  3. [VB.net] Générer une date selon condition
    Par WriteLN dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2005, 16h12
  4. [VB.NET] Changer de classe selon condition
    Par daner06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/10/2004, 10h04
  5. DLLs chargées selon condition
    Par Benjamin GAGNEUX dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 12/08/2004, 18h14

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