Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 00h00   #1
Invité de passage
 
david melix
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations personnelles :
Nom : david melix
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 4
Points : 4
Par défaut Supprimer du texte d'une colonne (pas tout)

Bonsoir,

J'ai créé une colonne referencedans laquelle se trouve lesdites references et leur descriptifs -> erreur de conception je me l'accorde


Je cherche en vain depuis quelques nuits à écrire un script permettant d'éliminer ce texte qui commence toujours par 'Le' (et dont la longueur est variable)

Code :
1
2
3
 
 UPDATE TABLE
SET reference = REPLACE( reference, LIKE "Le%","");
LIKE % n'est pas compris

Ou bien c'est moi qui n'ai pas compris ?
melix1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 08h49   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 974
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 974
Points : 18 216
Points : 18 216
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par melix1 Voir le message
Je cherche en vain depuis quelques nuits à écrire un script permettant d'éliminer ce texte qui commence toujours par 'Le' (et dont la longueur est variable)
Si "Le" ne peut pas faire partie de ce qui précède le texte à éliminer, il faut chercher la position de "Le" et ne garder que le nombre de caractères précédant cette position.
Code :
SELECT POSITION('Le' IN '1234Le quelque chose')
=> 5

Code :
SELECT LEFT('1234Le quelque chose', POSITION('Le' IN '1234Le quelque chose') - 1)
=> '1234'

Adapté à ton cas :
Code :
SELECT LEFT(reference, POSITION('Le' IN reference) - 1)
Cette fonction fait partie des fonctions de chaînes de caractères de MySQL.
Bonne nuit !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2010, 00h46   #3
Invité de passage
 
david melix
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations personnelles :
Nom : david melix
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 4
Points : 4
Merci Phil,

Si j'ai bien pigé, ce script selectionne la partie gauche -1 à partir de la chaine "Le"

Ca marche au poil !

Code :
1
2
SELECT LEFT(`reference`, POSITION('Le' IN reference) - 1)
FROM matable
Puis-je integrer cette commande SELECT avec INSERT INTO (genre comme ca )?

Code :
1
2
3
4
5
6
ALTER TABLE matable
	ADD aleax_reference VARCHAR (40);
 
INSERT INTO matable (aleax_reference)
SELECT LEFT(`reference`, POSITION('Le' IN reference) - 1)
FROM matable;
ou alors il y a plus simple ?
melix1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 00h58   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 974
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 974
Points : 18 216
Points : 18 216
Envoyer un message via MSN à CinePhil
INSERT ajoute des lignes à la table !
Ce que tu veux, je crois que c'est plutôt alimenter ta nouvelle colonne avec la chaîne calculée ?
Code :
1
2
UPDATE ta_table
SET aleax_reference = LEFT('reference', POSITION('Le' IN 'reference') - 1)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2010, 01h54   #5
Invité de passage
 
david melix
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations personnelles :
Nom : david melix
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 4
Points : 4
Oui,
j'ai testé INSERT et je retrouve les resultats dont les yeux ne sont pas en face des trous

j'étais en train de batailler avec des jointures quand je t'ai enfin lu !

Faudra que je te paye une mousse quand je serai de passage à toulouse
melix1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 08h35   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 974
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 974
Points : 18 216
Points : 18 216
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par melix1 Voir le message
Faudra que je te paye une mousse quand je serai de passage à toulouse
Volontiers !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2011, 23h20   #7
Invité de passage
 
david melix
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations personnelles :
Nom : david melix
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 4
Points : 4
Tout est bien rangé dans l'étable MYSQL
J'ai quand même du aller chercher quelques moutons : Merci Phil pour le chemin !

La colonne est sensée : soit etre vide, soit contenir une reference

SELECT ne me retrouve plus rien !!!
J'ai bien gratté et je me retrouve avec un (espace) et un (return) en fin de chaine...

Code :
1
2
UPDATE ma_table
SET aleax_reference = REPLACE(REPLACE(aleax_reference,"\n",""),"\r","") ;
Et la, les champs supposés vides (pas null) n'ont plus de (return) mais toujours un (espace) que je n'arrive pas à eradiquer ni à identifier !

Code :
1
2
3
4
UPDATE ma_table
SET aleax_reference= REPLACE( aleax_reference," ","");
 
L,R,TRIM pas efficace non plus
Rien n'y fait !

Par ailleurs, les champs contenant les references n'ont pas cet espace inconnu!!
D'ou l'impossibilité de virer le dernier caractere...

Alors voici le début de la solution :

Est ce que un champ NULL vide contient un caractère invisible et imposé par le programme ?
Si oui, quel est il ???

Sinon, comment savoir quel est ce caractère invisible (qui n'est pas 'espace') ???
melix1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 07h28   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 974
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 974
Points : 18 216
Points : 18 216
Envoyer un message via MSN à CinePhil
Les valeurs textuelles s'écrivent entre apostrophes, pas entre guillemets.

Citation:
J'ai bien gratté et je me retrouve avec un (espace) et un (return) en fin de chaine...
Ma requête de mise à jour n'était pas sensée ajouter \n\r ! C'est donc qu'ils figuraient déjà dans la colonne, avant 'Le'.

Citation:
Et la, les champs supposés vides (pas null) n'ont plus de (return) mais toujours un (espace) que je n'arrive pas à eradiquer ni à identifier !
Sauf qu'avec ta première requête, tu n'as pas supprimé d'espace !
Avec la deuxième, en principe oui.

Citation:
Est ce que un champ NULL vide contient un caractère invisible et imposé par le programme ?
NULL est un marqueur d'absence de valeur. Il ne peut être testé que par IS NULL ou IS NOT NULL parce que NULL n'est égal à rien, pas même à NULL.
Donc une colonne (et pas champ !) NULL et une colonne vide sont deux choses différentes : vide = une chaîne vide ''.

Si ta référence est purement numérique, essaie cette requête :
Code :
1
2
3
SELECT aleax_reference -- + les colonnes te permettant de retrouver la ligne
FROM ta_table
WHERE aleax_reference < 1
Tu devrais avoir toutes les références "vides".
Ensuite, s'il n'y a pas de lignes résultat qui ne doivent être vides, tu devrais pouvoir faire ceci :
Code :
1
2
3
UPDATE ta_table
SET aleax_reference = NULL
WHERE aleax_reference < 1
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2011, 00h04   #9
Invité de passage
 
david melix
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations personnelles :
Nom : david melix
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 4
Points : 4
BOUDI !!!
References pas entièrement numerique : FJ0523 , PQ6539, F1230 ,

Analysons la situation :

Toutes les references contiennent plus d'un caractere.

Je cherche à effacer les lignes de celles qui n'en contiennent qu'un ( l'inconnu ) ou pas !

Code :
1
2
SELECT * FROM ma_table 
WHERE CHAR_LENGTH(aleax_reference) < 2


Alors LENGTH , CHAR, et CHAR_LENGTH ne me donnent pas les memes resultats ???


Code :
1
2
DELETE FROM ma_table
WHERE aleax_reference = CHAR_LENGTH(aleax_reference) < 2
m'efface toute les données de la colonne, meme >2 ????
NO COmpRenDo NaDa...

Plus je veux faire simple, plus c'est compliqué !
melix1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 09h34   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 974
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 974
Points : 18 216
Points : 18 216
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par melix1 Voir le message
References pas entièrement numerique : FJ0523 , PQ6539, F1230 ,
Donc variabilité de la forme des références :
- 1 lettre + 4 chiffres ;
- 2 lettres + 4 chiffres ;
- autres ?

Citation:
Toutes les references contiennent plus d'un caractere.

Je cherche à effacer les lignes de celles qui n'en contiennent qu'un ( l'inconnu ) ou pas !

Code :
1
2
SELECT * FROM ma_table 
WHERE CHAR_LENGTH(aleax_reference) < 2
Alors LENGTH , CHAR, et CHAR_LENGTH ne me donnent pas les memes resultats ???
Extrait de la doc MySQL, qu'il est bon de consulter avant de poser les questions !
Citation:
CHAR(N,...) La fonction CHAR() interprète les arguments comme des entiers et retourne une chaîne de caractères, constituée des caractères, identifiés par leur code ASCII. Les valeurs NULL sont ignorées :
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
-> 'MMM'

CHAR_LENGTH(str) Retourne le nombre de caractères de la chaîne str: Un caractère multi-octets compte comme un seul caractère. Cela signifie que pour une chaîne contenant 5 caractères de 2 octets, LENGTH() retournera 10, alors que CHAR_LENGTH() retournera 5.
Citation:
Code :
1
2
DELETE FROM ma_table
WHERE aleax_reference = CHAR_LENGTH(aleax_reference) < 2
m'efface toute les données de la colonne, meme >2 ????
NO COmpRenDo NaDa...
Lis ta requête :
Supprimer de la table "ma_table"
les lignes où la colonne aleax_reference est égale au résultat logique de (nombre de caractères de aleax_reference inférieur à 2).
Le résultat logique est un booléen qui vaudra 0 ou 1.

La bonne requête serait plutôt celle-ci :
Code :
1
2
DELETE FROM ma_table
WHERE CHAR_LENGTH(aleax_reference) < 2
Ton SELECT était bon et tu n'avais plus qu'à le transformer en DELETE.
Ceci dit, DELETE supprime des lignes, pas le contenu d'une colonne ! Est-ce vraiment ce que tu veux faire ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2011, 01h51   #11
Invité de passage
 
david melix
Inscription : novembre 2009
Messages : 15
Détails du profil
Informations personnelles :
Nom : david melix
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : novembre 2009
Messages : 15
Points : 4
Points : 4
Citation:
Donc variabilité de la forme des références :
- 1 lettre + 4 chiffres ;
- 2 lettres + 4 chiffres ;
- autres ?
Heu oui, beaucoup d'autres aussi

Citation:
Extrait de la doc MySQL, qu'il est bon de consulter avant de poser les questions !
Voila !!! J'aurais du commencer par la ! parce que mon bouquin de chevet sur le sujet est assez peu fourni !!!

Citation:
Ceci dit, DELETE supprime des lignes, pas le contenu d'une colonne ! Est-ce vraiment ce que tu veux faire ?
Exactement, absolument j'avais essayé plusieurs formules qui tournaient autour du pot dont je ne fournirait pas d'exemples par respect de bienseance

Phil, je te promet que je reviendrai bientot t'embeter avec de nouvelles questions sur les trigger dont je n'ai absolument pas abordé le sujet

melix1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h34.


 
 
 
 
Partenaires

Hébergement Web