[RESOLU] insert/update ifnull/ifnotnull

insert/update ifnull/ifnotnull [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 08-09-2011 à 14:55:08    

Bonjour,
 
J'aimerais pouvoir faire un insert si une variable est null ou un update si cette dernière n'est pas null.
 
J'explique :
- je fais un select d'un id dans une variable :
exemple : select @var:=id from TABLE where nom = 'exemple' limit 1;
- à cette étape, on est d'accord pour dire que @var est null si aucun champs 'nom' dans la table 'TABLE' n'est égal à 'exemple' mais qu'il prend l'id du champs si celui-ci existe.
A partir de là, je peux maintenant faire une update si @var n'est pas null avec comme id @var ou je peux faire un insert si @ est null.
 
Seulement, la fontion ifnull m'est inutile ici puisqu'elle ne permet que dans remplacer la valeur d'un champs si celui-ci est null.
 
En gros j'aimerais pouvoir faire quelque chose du genre :
1. select @var:=id from TABLE where nom = 'exemple' limit 1;
2. ifnull(@var,insert ...., update)
avec comme structure : ifnull (expression à évaluer, action si c'est null, action si ce n'est pas null)
 
J'espère m'être bien expliqué, si ce n'est pas le cas dites le moi.
 
Merci d'avance pour vos réponses


Message édité par XP-1000 le 23-09-2011 à 14:27:18

---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 08-09-2011 à 14:55:08   

Reply

Marsh Posté le 09-09-2011 à 09:18:39    

Le plus facil est de faire un update, si le nombre de lignes mise a jour est 0 faire un insert.
Pas besoin de transactions et pas de risque de deadlock.
 
Il y a peut etre moye nde le faire en une fois mais ca depend du SGBD (en SQL server il y a le MERGE).

Reply

Marsh Posté le 09-09-2011 à 09:30:32    

merci pour votre réponse,
j'utilise mysql (5.5 je crois)
Ca me paraît bien comme solution mais
comment mettez vous en place la condition : if 0 row update => insert ?
merci d'avance


---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 09-09-2011 à 09:34:37    

Je ne connais pas bien MySQL, mais il devrai y avoir un test avec le nombre de row mise a jour.

Reply

Marsh Posté le 09-09-2011 à 11:44:16    

Code :
  1. IF @var IS NULL
  2. BEGIN
  3.  INSERT <...>
  4. END
  5. ELSE
  6. BEGIN
  7.  UPDATE <...>
  8. END

Message cité 1 fois
Message édité par furie gastrique le 09-09-2011 à 11:44:29
Reply

Marsh Posté le 09-09-2011 à 13:15:38    

furie gastrique a écrit :

Code :
  1. IF @var IS NULL
  2. BEGIN
  3.  INSERT <...>
  4. END
  5. ELSE
  6. BEGIN
  7.  UPDATE <...>
  8. END



 
Merci pour votre réponse,  
j'ai créé un script :

Code :
  1. set @var:=null;
  2. IF @var IS NULL
  3. BEGIN
  4. SELECT * FROM TABLE1;
  5. END
  6. ELSE
  7. BEGIN
  8. SELECT * FROM TABLE2;
  9. END


 
et à priori mon sgbd ne gère pas ce genre de strucure :
 

Spoiler :

source test.sql
Query OK, 0 rows affected (0.00 sec)
 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF @var IS NULL
BEGIN
select * from BV_FORMULA' at line 1
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END
ELSE
BEGIN
SELECT * FROM BV_GFX' at line 1
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 1



---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 09-09-2011 à 13:20:53    

La structure est un peu différente en MySQL, en effet: http://dev.mysql.com/doc/refman/5. [...] ement.html


Message édité par furie gastrique le 09-09-2011 à 13:21:04
Reply

Marsh Posté le 09-09-2011 à 14:12:26    

merci pour le lien, je viens de tenter un simple :

 

set @var:=1;
IF @var=1 then select * from TABLE
END IF

 

mais ca ne fonctionne pas non plus


Message édité par XP-1000 le 09-09-2011 à 14:13:51

---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 09-09-2011 à 14:37:18    

Alors ca, ca fonctionne :  

Code :
  1. DELIMITER //
  2. CREATE FUNCTION SimpleCompare(n INT, m INT)
  3.   RETURNS VARCHAR(20)
  4.   BEGIN
  5.     DECLARE s VARCHAR(20);
  6.     IF n > m THEN SET s = '>';
  7.     ELSEIF n = m THEN SET s = '=';
  8.     ELSE SET s = '<';
  9.     END IF;
  10.     SET s = CONCAT(n, ' ', s, ' ', m);
  11.     RETURN s;
  12.   END //
  13. DELIMITER ;


 
Mais impossible de faire ca, si ce n'est pas dans une fonction.


---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 09-09-2011 à 14:57:15    

Ou dans une procédure stockée.

Reply

Marsh Posté le 09-09-2011 à 14:57:15   

Reply

Marsh Posté le 09-09-2011 à 16:23:47    

oui mais ca ne m'interesse vraiment pas une procédure stocké car j'ai besoin de cette structure pour d'innombrables requêtes totalement différentes les unes des autres et si je dois faire une procédure stockée spéciale pour chacune d'entre elle je n'ai pas fini ..


---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 09-09-2011 à 16:33:07    

Est-ce que tu es sûr que c'est comme cela que tu dois faire? Si au niveau du langage parent (PHP?), tu sais si la valeur est nulle ou non, tu peux le faire au niveau de PHP.

Reply

Marsh Posté le 09-09-2011 à 16:47:06    

c'est bien ca le problème,
c'est un script bash qui appelle un script sql.
Il aurait été plus pertinent de le faire en php à la base mais je ne pensais pas qu'il prendrait autant d'ampleur et maintenant que j'ai commencé comme ca ..


---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 12-09-2011 à 09:39:57    

Un bete script qui fait ca ne marche pas? :

Code :
  1. UPDATE truc SET A = 1 WHERE B = 2
  2. IF ROW_COUNT() = 0 THEN
  3. INSERT truc (A,B) VALUES (1,2)
  4. END IF

Reply

Marsh Posté le 19-09-2011 à 13:52:39    

Bonjour,
Désolé pour la longue absence.
Non cela ne fonctionne pas : erreur sql syntax


---------------
Pourquoi linux est meilleur ?
Reply

Marsh Posté le 19-09-2011 à 21:14:04    

Peut être avec la fonction "REPLACE" ?
Si l'id existe, la ligne sera mise à jour. Sinon, il y aura insertion.


---------------
Doucement le matin, pas trop vite le soir.
Reply

Marsh Posté le 23-09-2011 à 14:27:00    

mrbebert a écrit :

Peut être avec la fonction "REPLACE" ?
Si l'id existe, la ligne sera mise à jour. Sinon, il y aura insertion.


Alors là, grand merci !
premièrement : Ca fonctionne parfaitement
deuxièmement : Ca demande pratiquement aucune modification à mes scripts
 
Merci beaucoup :D


---------------
Pourquoi linux est meilleur ?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed