chaines de caractères : LEFT() / RIGHT() [ MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 13-12-2005 à 11:03:03
J'ai trouvé la solution mais j'ai oublié de la poster depuis :
Update ma_table set mon_champs=INSERT(
mon_champs,
indice,
1,
CAST(1 +
CAST (
MID(mon_champs,indice,1)
as BINARY) as BINARY))
where condition1=x and condition2=y;
J'avais mal compris la doc sur INSERT, d'où ma requête ultra tordue
Marsh Posté le 14-12-2005 à 17:33:43
travaille sur "0"+mon_champs+"0".... oui je sais, je suis la reine de la bidouille
Marsh Posté le 15-12-2005 à 10:03:42
tu dis que tu arrives a faire le travail que tu veux SAUF pour les "bord", donc si ta chaine au depart c'est "123456" est bien tu fais ton travail sur la chaine "01234560" ("0" + chaine + "0" ) et tu inserts ta chaine en enlevant tes "0"... J'avais prevenu c'est de la bidouille, mais j'ai pas de base sous la main pour tester des MID/RIGHT/LEFT ....
Marsh Posté le 15-12-2005 à 11:37:32
ah ok
oui ca aurait pu se faire mais en l'occurence la nouvelle requête fonctionne au poil donc inutile de faire plus compliqué
Merci néanmoins pour l'idée
Marsh Posté le 15-12-2005 à 11:40:36
euh...
attends, c'est sql server à ce que je vois...
bouge, pas, delete tout de suite ta fonction de goret, et utilise celle de sql server, qui fait déjà ce que tu veux
bouge pas, je la cherche
Marsh Posté le 15-12-2005 à 11:43:05
|
Marsh Posté le 15-12-2005 à 11:45:28
seul truc à faire avant de l'appeler, c'est un petit substring afin de trouver à la valeur à incrémenter...
Marsh Posté le 15-12-2005 à 11:57:49
Et voilà, Dieu a terminé sans tambouille
|
Marsh Posté le 15-12-2005 à 11:59:01
Jeu de résultat :
|
Marsh Posté le 15-12-2005 à 12:05:07
Autre solution bien plus propre.
Cette fois, on exploite l'aspect numérique de la chose :
|
(attention, "position" se lit maintenant de droite à gauche, en suivant les chiffres !)
Jeu de résultat (même avec les cas particluliers ça marche)
|
Marsh Posté le 15-12-2005 à 12:09:47
Je n'insiste pas sur le fait que la dernière solution est de loin la meilleure et la plus rapide
Marsh Posté le 15-12-2005 à 12:10:35
au lieu de replicate, on aurait pu aussi mettre :
@truc = pow(10, @position - 1)
c'était encore plus propre
Marsh Posté le 15-12-2005 à 13:54:14
il s'agit bien de MySQL et ta fonction STUFF est identique à INSERT
Citation : Update ma_table set mon_champs=INSERT( |
Citation : select numeve, stuff(cast(numeve as varchar), @position, 1, cast(cast(substring(cast(numeve as varchar), @position, 1) as int) + @increment as varchar)) |
Marsh Posté le 15-12-2005 à 14:07:43
jeoff a écrit : il s'agit bien de MySQL et ta fonction STUFF est identique à INSERT
|
dans tous les cas, la dernière solution est la plus propre (c'est même la seule à l'être)
Marsh Posté le 15-12-2005 à 14:08:05
Code :
|
Marsh Posté le 15-12-2005 à 14:08:21
ça tiens en 2 lignes, et y'a pas un seul traîtement de chaînes.
Marsh Posté le 08-12-2005 à 18:36:53
Bonjour,
Je vous expose le problème :
Dans un champs type varchar, j'ai un mot composé de caractères continu.
Ce mot est en réalité une suite de chiffres. ex :01235410
Je fourni un indice à une de mes fonctions. A l'aide de cet indice, ma fonction doit générer une requête.
Cette requête va lire dans la base le champs qui m'intéresse.
Elle doit en extraire la valeur à l'indice fourni, l'incrémenter de 1 ou plus et remplacer l'ancienne valeur par celle incrémentée. ex:01236410
Pour l'instant j'ai trouvé une requête mais elle ne marche pas si l'indice est égal à un des "bords" (1 ou taille_max donc) car LEFT(champs,0) ou RIGHT(champs,0) renvoie du caca au lieu d'une chaîne vide
Prenez une chaise :
Update ma_table set mon_champs=INSERT(
LEFT(mon_champs,indice),
indice,
LENGTH(mon_champs) - indice + 1,
CONCAT(CAST(1+MID(mon_champs,1) as BINARY),RIGHT(mon_champs,LENGTH(mon_champs - indice))
where condition1=x and condition2=y
Un grand merci par avance pour ceux qui sont arrivés jusqu'ici .
Message édité par jeoff le 08-12-2005 à 18:46:49