2008-10-09 10 views
0

Est-il possible dans le langage SQL ou dans MySQL (ou autre DBMA) de transférer une valeur d'une cellule à une autre? Par exemple, dire qu'il ya une table appelée user_cars avec la structure suivante:Un moyen de transférer la valeur d'une cellule à l'autre?

|id| |user_name| |num_cars| 

Bob a 5 voitures, et John a 3 voitures. Est-il possible de soustraire 2 voitures de Bob et d'ajouter 2 à John? Je sais que cela peut être fait avec deux requêtes de mise à jour, mais je voudrais juste savoir s'il y avait un moyen plus efficace.

Répondre

4

Pour Oracle, vous pouvez le faire. Je ne sais pas s'il y a un équivalent dans mysql. De toute évidence, cette déclaration particulière est très spécifique à l'exemple que vous avez indiqué.

UPDATE user_cars 
    SET num_cars = num_cars + 
        CASE WHEN user_name='Bob' THEN -2 
          WHEN user_name='John' THEN +2 
        END 
    WHERE user_name IN ('Bob', 'John') 
1

C'est ce que les transactions sont pour ...

0

Si vous voulez vraiment faire dans une requête, vous pouvez faire une mise à jour sur une jointure réflexive de la table, mais il est à la fois moins lisible et probablement moins efficace.

2

Cela fonctionne, mais il est agréable:

UPDATE USER_CARS UC 
SET 
    NUM_CARS = NUM_CARS + CASE WHEN UC.USER_NAME = 'Bob' 
          THEN -2 --take from bob 
          WHEN UC.USER_NAME = 'John' 
          THEN 2 --give to John 
          ELSE 0 --no change for anybody else 
         END 
+0

Vous devez toujours utiliser une clause WHERE pour restreindre la quantité de lignes en cours de mise à jour (à Bob et John uniquement). Ajouter zéro résultats dans la même valeur, mais il compte toujours comme un changement pour les journaux de transactions, les déclencheurs, etc. Les tables avec beaucoup de lignes entraînerait des performances lentes. – JeremyDWill

0

Je suis d'accord avec Jonas Klemming, il isnt une manière significative de le faire. C'est précisément ce que les transactions ont été inventées à faire.

1

Comme d'autres l'ont expliqué, vous pouvez le faire avec une instruction CASE.
Cependant, cela est probablement imprudent, car cela rend l'intention du code plus difficile à voir. Cela rendra plus difficile pour un programmeur ultérieur de comprendre le but du code.

Sauf si vous avez des raisons spécifiques de devoir le faire en une seule instruction, la meilleure chose à faire est d'utiliser 2 instructions de mise à jour, en les enveloppant dans une transaction si nécessaire.

Je me rappelle souvent cette citation (même si je devais regarder l'attribution sur wikiquote):

« Les programmes doivent être écrits pour les gens à lire, et accessoirement pour les machines à exécuter. » - Abelson & Sussman, SICP, préface de la première édition

Questions connexes