Vider un champ, en fonction de sa valeur. [Résolu]

mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 01:46 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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é
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 22:07
3
Merci
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
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 12:51
0
Merci
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
*/
Commenter la réponse de cs_coq
mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 13:23
0
Merci
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'
Commenter la réponse de mankinder
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 14:12
0
Merci
Heu, j'avoue que je ne suis pas là...
Quelle est la définition de la table ?

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 14:46
0
Merci
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

Commenter la réponse de mankinder
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 14:55
0
Merci
Il y a une colonne par employé ?

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 15:03
0
Merci
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 ^^.
Commenter la réponse de mankinder
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 15:34
0
Merci
Oui, tu t'es tiré dans le pied là.

Tu travailles sur quel SGBD ?

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 18:20
0
Merci
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.
Commenter la réponse de mankinder
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 19:08
0
Merci
Oui et non, ça dépend du SGBD. Lequel utilises tu ?

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 21:24
0
Merci
Je suis sur le systeme MySQL. 
Commenter la réponse de mankinder
mankinder 18 Messages postés mardi 22 avril 2003Date d'inscription 28 septembre 2012 Dernière intervention - 30 juin 2007 à 23:37
0
Merci
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 ^^
Commenter la réponse de mankinder
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 30 juin 2007 à 23:48
0
Merci
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.