[ MySQL] chaines de caractères : LEFT() / RIGHT()

chaines de caractères : LEFT() / RIGHT() [ MySQL] - SQL/NoSQL - Programmation

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 :o
 
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 :D.


Message édité par jeoff le 08-12-2005 à 18:46:49
Reply

Marsh Posté le 08-12-2005 à 18:36:53   

Reply

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 :whistle:

Reply

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 :p

Reply

Marsh Posté le 15-12-2005 à 09:20:38    

:heink: rien compris  :??:  
 
développe stp  :jap:

Reply

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 :) ....

Reply

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é :lol:
 
Merci néanmoins pour l'idée ;)


Message édité par jeoff le 15-12-2005 à 11:37:52
Reply

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 :o
 
bouge pas, je la cherche

Reply

Marsh Posté le 15-12-2005 à 11:43:05    


 Référence de Transact-SQL  
 
 
STUFF
Supprime une longueur de caractères donnée et insère un autre jeu de caractères à partir d'une position donnée.
 
Syntaxe
STUFF ( character_expression , start , length , character_expression )  
 
Arguments
character_expression
 
Expression d'une donnée caractère. character_expression peut être une constante, une variable ou une colonne de données de type caractère ou binaire.
 
start
 
Entier précisant la position de départ de la suppression et de l'insertion. Si start ou length est négatif, une chaîne NULL est renvoyée. Il en va de même si la valeur start dépasse la longueur de la première character_expression.
 
length
 
Entier précisant le nombre de caractères à supprimer. Si la valeur de length est plus longue que la première character_expression, la suppression s'effectue jusqu'au dernier caractère de la dernière character_expression.
 
Type des valeurs renvoyées
Renvoie des données de type caractère si character_expression correspond à l'un des types de données caractères pris en charge. Renvoie des données de type binaire si character_expression correspond à l'un des types de données binaires pris en charge.
 
Notes
Il est possible d'imbriquer des fonctions de chaîne.
 
Exemple
Dans l'exemple suivant, la procédure renvoie une chaîne de caractères créée en supprimant trois caractères de la première chaîne (abcdef) à partir de la position 2 (à b) et en insérant la seconde chaîne au point de suppression.
 
SELECT STUFF('abcdef', 2, 3, 'ijklmn')
GO
 
Voici le jeu de résultats obtenu :
 
---------  
aijklmnef  
 
(1 row(s) affected)
 
 
Voir aussi
 
Types de données
 
Fonctions de chaîne
 
©1988-2000 Microsoft Corporation. Tous droits réservés.

Reply

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...

Reply

Marsh Posté le 15-12-2005 à 11:57:49    

Et voilà, Dieu a terminé sans tambouille :sol:


declare @position as int
declare @increment as int
set @position = 3
set @increment = 2
 
select numeve, stuff(cast(numeve as varchar), @position, 1, cast(cast(substring(cast(numeve as varchar), @position, 1) as int) + @increment as varchar))
from eve  

Reply

Marsh Posté le 15-12-2005 à 11:57:49   

Reply

Marsh Posté le 15-12-2005 à 11:59:01    

Jeu de résultat :


802635 804635
802638 804638
300000 302000
300001 302001
300002 302002


Message édité par Arjuna le 15-12-2005 à 11:59:15
Reply

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 :
 


declare @position as int
declare @increment as int
declare @truc as int
set @position = 3
set @increment = 2
set @truc = cast('1' + replicate('0', @position - 1) as int)
 
select numeve, numeve + @truc * @increment
from eve


 
(attention, "position" se lit maintenant de droite à gauche, en suivant les chiffres !)
 
Jeu de résultat (même avec les cas particluliers ça marche)


5      205.000000
300109 300309.000000
300110 300310.000000
100000 100200.000000
100001 100201.000000


Message édité par Arjuna le 15-12-2005 à 12:08:46
Reply

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 ;)

Reply

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 :)

Reply

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(
   mon_champs,
   indice,
   1,
   CAST(1 +  
                CAST (
                          MID(mon_champs,indice,1)
                                                               as BINARY) as BINARY))
   where condition1=x and condition2=y;


 

Citation :

select numeve, stuff(cast(numeve as varchar), @position, 1, cast(cast(substring(cast(numeve as varchar), @position, 1) as int) + @increment as varchar))
from eve

Reply

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
 

Citation :

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;


 

Citation :

select numeve, stuff(cast(numeve as varchar), @position, 1, cast(cast(substring(cast(numeve as varchar), @position, 1) as int) + @increment as varchar))
from eve



dans tous les cas, la dernière solution est la plus propre (c'est même la seule à l'être)

Reply

Marsh Posté le 15-12-2005 à 14:08:05    

Code :
  1. declare @position as int
  2. declare @increment as int
  3. declare @truc as int
  4. set @position = 3
  5. set @increment = 2
  6. set @truc = pow(10, @position - 1)
  7. select numeve, numeve + @truc * @increment
  8. from eve


Message édité par Arjuna le 15-12-2005 à 14:08:42
Reply

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.

Reply

Sujets relatifs:

Leave a Replay

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