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

SQL Oracle Discussion :

Update case when sans else


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Par défaut Update case when sans else
    Bonjour à tous;

    J'ai une table de prix table_prix dont je voudrais mettre a jour seulement certain prix.
    Actuellement la requête ets la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Update table_prix
    set prix = prix +
    case
    when produit_id = 2150 then 1 //on augmente le prix du produit 2150 de 1 euros
    when produit_id = 1236 then 2 // on augmente le prix du produit 1236 de 2 euros
    else 0
    end
    Le souci du else 0 c'est qu'il effectue l'opération +0 sur toute la table et cela rallonge l'update.
    Cette requête doit pouvoir être utilisée sur une dizaine de produit d'un coup parfois.

    Y'a-t-il moyen de faire différemment sans devoir spécifier else 0 (si je ne met pas else 0, j'ai une erreur). ET sinon serait-il alors carrement mieux au niveau vitesse d'exécution de lancer N update du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Update table_prix
    set prix = prix + X
    where produit_id = Y
    ou bien de lancer des groupes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table_prix
    set prix = prix +X
    where produit_id in (Y1, Y2, Y3....)
    Merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 408
    Par défaut
    Bonjour,
    Si tu ne veux pas mettre à jour toutes les lignes de la table, la seule solution est de mettre une restriction, donc un WHERE.
    Le ELSE est obligatoire, il faut bien que le moteur sache quoi faire "par défaut", même si toi tu sais que tous les cas sont couvert par les différents WHEN.

    Tatayo.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    non, le ELSE n'est pas obligatoire en soi : si vous l'omettez ce sera NULL.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    non, le ELSE n'est pas obligatoire en soi : si vous l'omettez ce sera NULL.
    Effectivement, ça fait null mais pas zéro. Et donc quand j’omet le else, j’ai,une erreur comme quoi prix = prix + null et ça va pas

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Par défaut
    Donc du coup je ne peux que faire ce qu’il y a actuellement ou sinon passer des groupes d’update pour tous les produits ayant le même changement de prix?

    ou sinon un produit un update?

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Pour reformuler un peu ce qui a été dit par les uns et les autres :

    Un UPDATE sans clause WHERE modifie effectivement toutes les lignes, et vous devez donc ajouter une condition cohérente avec les différents cas traités dans le CASE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Update table_prix
    set prix = prix +
    case
    when produit_id = 2150 then 1 //on augmente le prix du produit 2150 de 1 euros
    when produit_id = 1236 then 2 // on augmente le prix du produit 1236 de 2 euros
    else 0
    end
    where produit_id in (1236, 2150);
    

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Je vois différentes possibilités, par exemple utiliser la fonction coalesce en SQL ou NVL si c'est Oracle pour transformer un null entre autre chose, comme zéro.
    Ceci dit, ce n'est pas une très bonne idée d'updater toute la table, y compris les lignes oµ le prix ne change pas. Il devrait y avoir une clause WHERE pour filtrer le jeu de données.
    Le CASE/WHEN a parfaitement sa place si vous voulez appliquer des conditions selon la classe de produits.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Pour reformuler un peu ce qui a été dit par les uns et les autres :

    Un UPDATE sans clause WHERE modifie effectivement toutes les lignes, et vous devez donc ajouter une condition cohérente avec les différents cas traités dans le CASE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Update table_prix
    set prix = prix +
    case
    when produit_id = 2150 then 1 //on augmente le prix du produit 2150 de 1 euros
    when produit_id = 1236 then 2 // on augmente le prix du produit 1236 de 2 euros
    else 0
    end
    where produit_id in (1236, 2150);
    
    Ok je vais rajouter une clause where. Ca permet de faire exactement ce que je veux

    Merci bcp a tous pour le temps passé!!!

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 204
    Par défaut
    Autre exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    merge into table_prix a 
    using  (
    select 2151 as product_id, 1 as delta
    union
    select 1236 as product_id, 2 as delta
    ) b
    on ( b.product_id = a.product_id )
    when matched then update set a.prix = a.prix + b.delta 
    ;

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

Discussions similaires

  1. [2012] Utilisation de la clause WHERE CASE WHEN ELSE END dans une procédure stockée
    Par djelloharmel dans le forum Développement
    Réponses: 5
    Dernier message: 23/09/2015, 19h36
  2. SUM(CASE WHEN THEN 1 ELSE 0 END) SUR PLUSIEURS LIGNES
    Par Dr_No dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/11/2012, 14h35
  3. Requete CASE WHEN ELSE
    Par Bendir dans le forum SQL
    Réponses: 3
    Dernier message: 07/07/2009, 14h01
  4. Equivalent "Select Case when then else end" sur Paradoxe
    Par Seuh.m dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/06/2006, 08h23
  5. Réponses: 5
    Dernier message: 31/10/2005, 13h25

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