2010-02-01 6 views
32

Comment mettre à jour une table et définir différentes valeurs lors de l'évaluation de la condition à True.MySQL - Utiliser sinon dans MySQL Mises à jour ou SELECT

Par exemple:

UPDATE Table 
SET A = '1' IF A > 0 AND A < 1 
SET A = '2' IF A > 1 AND A < 2 
WHERE A IS NOT NULL; 

J'ai vu l'expression de cas, et si l'expression dans les procédures et fonctions, mais je veux l'utiliser dans une mise à jour simple/instruction select. Est-ce possible ou est-ce que j'attends trop de cette belle base de données open source?

Répondre

41
UPDATE table 
SET A = IF(A > 0 AND A < 1, 1, IF(A > 1 AND A < 2, 2, A)) 
WHERE A IS NOT NULL; 

vous pouvez utiliser CEIL() si A est toujours une valeur en virgule flottante > 0 et <= 2

+0

Les valeurs de a a re juste des exemples. Je veux l'appliquer à n'importe quelle condition. Par exemple: SI A N'EST PAS NULL, SET à 'Varchar Value' ELSE SET à 'Some Other Varchar Value'; Je vais donner une solution à votre solution et voir comment cela fonctionne. Merci beaucoup! – ThinkCode

+0

avez-vous une idée de ce que vous faites? Je ne peux pas le voir pour le moment .. – inetphantom

6

Voici une requête pour mettre à jour une table basée sur une comparaison d'une autre table. Si l'enregistrement n'est pas trouvé dans la tableB, il mettra à jour la valeur "active" à "n". S'il est trouvé, définira la valeur à NULL

UPDATE tableA 
LEFT JOIN tableB ON tableA.id = tableB.id 
SET active = IF(tableB.id IS NULL, 'n', NULL)"; 

Espérons que cela aide quelqu'un d'autre.

16

Alors que vous avez certainement pouvez utiliser la fonction de contrôle de flux de MySQL IF()as demonstrated by dbemerlin's answer, je pense qu'il pourrait être un peu plus clair au lecteur (c.-à-vous, et les futurs développeurs qui pourraient choisir votre code à l'avenir) d'utiliser un CASE expression à la place:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     ELSE A 
     END 
WHERE A IS NOT NULL 

Bien sûr, dans cet exemple spécifique, il est un peu inutile de mettre A à lui-même dans la ELSE clause mieux entièrement pour filtrer ces conditions du UPDATE, via la clause WHERE:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     END 
WHERE (A > 0 AND A < 1) OR (A > 1 AND A < 2) 

(les inégalités impliquent A IS NOT NULL).

Ou, si vous voulez que les intervalles fermés plutôt que d'ouvrir (notez que cela fixerait les valeurs de 0-1 -si qui est indésirable, on peut filtrer explicitement de tels cas dans la clause WHERE, ou ajouter une autre plus priorité WHEN condition):

UPDATE Table 
SET A = CASE 
     WHEN A BETWEEN 0 AND 1 THEN 1 
     WHEN A BETWEEN 1 AND 2 THEN 2 
     END 
WHERE A BETWEEN 0 AND 2 

Bien que, comme dbmerlin a également souligné, pour cette situation particulière vous pourriez envisager d'utiliser à la place CEIL():

UPDATE Table SET A = CEIL(A) WHERE A BETWEEN 0 AND 2 
+1

Ceci est une présentation beaucoup plus propre et fonctionne universellement même s'il y a plus de deux conditions. La solution d'instruction 'if()' proposée par @dbemerlin nécessite l'imbrication de deux conditions, ce qui rend la lecture et la compréhension de la logique encore plus difficiles. –