[SQL] Inverser un champ

frank -  
 neemzy -
Bonjour,
j'ai un champ enum('0', '1')
dans une table il est par defaut à 0 et j'aimerais une requete qui si ce champ est à 0 le fait passer à 1 et s'il est à 1 le fait passer à 0
je pourrais passer par php pour recupérer la valeur du champs puis faire la requete en conséquence mais je prefere le faire directement avec MYSQl si c'est possible
merci d'avance

1 réponse

  1. GallyNet Messages postés 437 Statut Membre 387
     
    Est-ce que tu peut rajouter une valeur a ton enum ? Si oui tu lui rjoute 2 et tu fais :
    UPDATE maTable
    SET champ=2
    WHERE champ=0;
    UPDATE maTable
    SET champ=0
    WHERE champ=1;
    UPDATE maTable
    SET champ=1
    WHERE champ=2;
    0
    1. Login Art
       
      Pour ceux que cela pourrait intéresser.

      Plutôt que d'utiliser un champ ENUM('0', '1') pour gérer les cas true/false avec MySQL, j'utilise un champ de type TINYINT(1) dans lequel j'envoie soit 0, soit 1.

      Pour la mise à jour de la table, par exemple pour définir si un utilisateur est à l'état "accepté" ou à l'état "non accepté", j'utilise les fonctions MOD(n,m) (fonction modulo) et ABS(x) (fonction absolu) :
      UPDATE user_tb SET user_estAccepte = ABS(MOD(user_estAccepte, 2) - 1) WHERE user_id = 1 OR user_id=3 OR user_id = 15;

      En effet, ABS(MOD(0,2) - 1) = 1 et ABS(MOD(1,2) - 1) = 0 : on obtient "l'inverse binaire".
      Si l'utilsateur 3 est accepté, il passe à l'état "non accepté" et si l'utilisateur 15 est non accepté, il passe à l'état "accepté" ... le tout dans une seule et même requête.

      Bon MySQL.
      0
      1. Login Art > Login Art
         
        La fonction MOD n'est pas obligatoire dans cet exemple en base 2.
        UPDATE user_tb SET user_estAccepte = ABS(user_estAccepte - 1) WHERE user_id = 1 OR user_id=3 OR user_id = 15;

        En effet, ABS(0 - 1) = 1 et ABS(1 - 1) = 0 : on obtient "l'inverse binaire".
        0
    2. neemzy
       
      Je me permets de déterrer ce topic, des fois que ça puisse servir à quelqu'un qui se pose la même question que moi aujourd'hui, à savoir comment inverser simplement un champ TINYINT(1) contenant 0 ou 1 (un champ binaire en somme) :

      L'idée proposée par Login Art n'est pas mauvaise, mais même sa version simplifiée peut encore être améliorée : il est possible de faire cela sans utiliser la moindre fonction SQL, simplement en inversant l'opération. Voyez plutôt :

      UPDATE user_tb SET user_estAccepte = (1 - user_estAccepte) WHERE [...]

      En effet, 1 - 1 = 0 et 1 - 0 = 1. Il suffisait d'y penser... ;)
      0