Vider un champ, en fonction de sa valeur.

Résolu
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012 - 30 juin 2007 à 01:46
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 30 juin 2007 à 23:48
Bonjour,

je cherche la requête qui pourrait me permettre de vider les champs dont la valeur est précisée.

Ex :

- Nom de la Table = EMPLOYES- Nom du Champ 1 PASCAL            => Contient la donnée : Stagiaire - Nom du Champ 2 LAURENCE       => Contient la donnée : Interimaire - Nom du Champ 3 BENOIT             => Contient la donnée : Interimaire - Nom du Champ 4 VALERIE           => Contient la donnée : Stagiaire - Nom du Champ 5 ERIC                  > Contient la donnée : Interimaire

Voilà, je voudrais que ma requête vide tout les champs qui contiennent la valeur "Stagiaire"
Est ce possible ?
Je pense que je suis sur mes codes depuis trop longtemps et tout s'embrouille dans mon esprit ^^
(Si vous vous reconnaissez dans cet exemple, rassurez vous, vous n'êtes pas licencié, juste promu )

Merci de votre réactivité

13 réponses

cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 22:07
Ok, je ne pourrais donc pas t'aider directement.

Donc en gros :
UPDATE EMPLOYES SET PASCAL=NULL WHERE PASCAL='Stagiaire';
UPDATE EMPLOYES SET LAURENCE=NULL WHERE LAURENCE='Stagiaire';
UPDATE EMPLOYES SET BENOIT=NULL WHERE BENOIT='Stagiaire';
...

Le tout étant de générer les 45 requêtes sans les faire à la main.

Si tu as besoin d'un point de départ, voici un script utilisable sous SQL Server qui trainait, je l'ai dégrossi "à la hache" mais il va falloir que tu finisses de l'adapter pour MySQL (logiquement les vues INFORMATION_SCHEMA.* sont identiques, reste les fonctions comme QUOTENAME & co, les filtres sur schéma et types de données, ajouter des filtres sur les colonnes non concernées) :

USE Test;


DECLARE @ColumnName nvarchar(128);


SET @ColumnName = '';


SET NOCOUNT ON;


WHILE (@ColumnName IS NOT NULL)
BEGIN
 SET @ColumnName =
 (
  SELECT MIN(QUOTENAME(COLUMN_NAME))
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'dbo'
   AND TABLE_NAME = 'EMPLOYES'
   AND DATA_TYPE IN ('char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext')
   AND QUOTENAME(COLUMN_NAME) > @ColumnName
 )


 IF @ColumnName IS NOT NULL
 BEGIN
  EXEC
  (    'UPDATE EMPLOYES SET ' + @ColumnName + ' NULL WHERE ' + @ColumnName + ' ''Stagiaire'''
  )
 END
END




A la rigueur, remplace l'execution directe par un PRINT (ou équivalent MySQL), ce qui te permettra de récupérer un script avec les 45 requêtes.

/*
coq
MVP Visual C#
CoqBlog
*/
3
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 12:51
Salut,

Une requête de ce genre non ? :

UPDATE EMPLOYES
SET <nom de la colonne "données"> = NULL
WHERE <nom de la colonne "données"> = 'Stagiaire'

/*
coq
MVP Visual C#
CoqBlog
*/
0
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012
30 juin 2007 à 13:23
Merci Coq pour cette précision,

mon problème vient surtout du fait, que je ne connais pas à l'avance, quels champs, contiennent la donnée en question,
donc je ne peux définir le nom du champ dans ma requête,
je cherche la ligne de code qui va parcourir toutes les colonnes, en étudier le contenu et la vider automatiquement, si son contenu = 'Stagiaire'
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 14:12
Heu, j'avoue que je ne suis pas là...
Quelle est la définition de la table ?

/*
coq
MVP Visual C#
CoqBlog
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012
30 juin 2007 à 14:46
Comme suit :

Nom de la table : EMPLOYES
Nb de champ : 45 mais dans mon exemple, je n'en citerai que 6

Champ 1 : id
Un numéro auto-incrémenté.
Champ 2 : Pascal
Contient le statut de l'employé, soit  Interimaire, soit Stagiaire et dans son cas la valeur contenue est : Interimaire.
Champ 3 : Laurence

Contient le statut de l'employé, soit  Interimaire, soit Stagiaire et dans son cas la valeur contenue est : Interimaire.
Champ 4 : Benoit

Contient le statut de l'employé, soit  Interimaire, soit Stagiaire et dans son cas la valeur contenue est : Interimaire.
Champ 5 :Valérie

Contient le statut de l'employé, soit  Interimaire, soit Stagiaire et dans son cas la valeur contenue est : Stagiaire.
Champ 6 : Eric

Contient le statut de l'employé, soit  Interimaire, soit Stagiaire et dans son cas la valeur contenue est : Interimaire.

Je cherche un moyen pour que ma requete, vide le champ de l'employé dont le statut = Stagiaire sans préciser qu'il sagit de Valérie, c'est une information que l'on ignore, car elle varie régulierement..
Bref dire à ma requête : "Fouilles la table et purge tout les champs contenant la valeur Stagiaire."

Mais peut-être n'est ce pas possible

0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 14:55
Il y a une colonne par employé ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012
30 juin 2007 à 15:03
Oui c'est exactementçà ^^
Je pourrais t'expliquer les raisons pour laquelle j'ai fait ce choix qui frise le gaspillage, mais çà n'est pas le sujet ^^.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 15:34
Oui, tu t'es tiré dans le pied là.

Tu travailles sur quel SGBD ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012
30 juin 2007 à 18:20
Héhé, non je ne me suis pas tiré dans le pied, simplement, toutes les BD ne sont pas les mêmes, parfois tu tombe sur une BD SQL facile à créer, et d'autre fois, les impératifs rendent la chose plus difficile et il faut s'adapter.

Bien entendu, les champs ne servent pas qu'a stocker l'information du statut, mais je n'ai pas jugé nécéssaire d'entrer dans les détail.
J'ai juste besoin de trouver une requête qui va parcourir toute la base de donnée et vider tout les champs ou elle rencontre la valeur 'Stagiaire'. Apparemment, çà n'est pas aussi simple que celà et je me réjouis de ce défi.
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 19:08
Oui et non, ça dépend du SGBD. Lequel utilises tu ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012
30 juin 2007 à 21:24
Je suis sur le systeme MySQL. 
0
mankinder Messages postés 18 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 28 septembre 2012
30 juin 2007 à 23:37
Merci pour l'intérêt que tu à porté à mon problème.

J'ai trouvé dans tes codes, les solutions qui me manquaient et désormais tout est rentré dans l'ordre,
sans toi, je pense que j'aurais abandonné et passé à autre chose, pour éventuellement revenir plus tard sur ce problème.

1000 mercis pour cette démonstration de compétence ^^
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 juin 2007 à 23:48
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous