Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1063 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1262008
jeoff
Posté le 08-12-2005 à 18:36:53  profilanswer
 

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
mood
Publicité
Posté le 08-12-2005 à 18:36:53  profilanswer
 

n°1265292
jeoff
Posté le 13-12-2005 à 11:03:03  profilanswer
 

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:

n°1266595
belldandys
Posté le 14-12-2005 à 17:33:43  profilanswer
 

travaille sur "0"+mon_champs+"0".... oui je sais, je suis la reine de la bidouille :p

n°1266956
jeoff
Posté le 15-12-2005 à 09:20:38  profilanswer
 

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

n°1266992
belldandys
Posté le 15-12-2005 à 10:03:42  profilanswer
 

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

n°1267057
jeoff
Posté le 15-12-2005 à 11:37:32  profilanswer
 

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
n°1267062
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 11:40:36  profilanswer
 

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

n°1267065
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 11:43:05  profilanswer
 


 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.

n°1267069
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 11:45:28  profilanswer
 

seul truc à faire avant de l'appeler, c'est un petit substring afin de trouver à la valeur à incrémenter...

n°1267083
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 11:57:49  profilanswer
 

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  

mood
Publicité
Posté le 15-12-2005 à 11:57:49  profilanswer
 

n°1267087
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 11:59:01  profilanswer
 

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
n°1267096
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 12:05:07  profilanswer
 

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
n°1267103
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 12:09:47  profilanswer
 

Je n'insiste pas sur le fait que la dernière solution est de loin la meilleure et la plus rapide ;)

n°1267105
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 12:10:35  profilanswer
 

au lieu de replicate, on aurait pu aussi mettre :
 
@truc = pow(10, @position - 1)
 
c'était encore plus propre :)

n°1267263
jeoff
Posté le 15-12-2005 à 13:54:14  profilanswer
 

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

n°1267300
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 14:07:43  profilanswer
 

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)

n°1267301
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 14:08:05  profilanswer
 

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
n°1267304
Arjuna
Aircraft Ident.: F-MBSD
Posté le 15-12-2005 à 14:08:21  profilanswer
 

ça tiens en 2 lignes, et y'a pas un seul traîtement de chaînes.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[MySQL] Recherche de mots dans un blobconnexion et echange de donnée avec base mysql
DELPHI DBExpress et MySqlproblèmes de caractères avec gettext
traitement des caractères fonctions Lef, Mid , Rightles chaines de caracteres
Script PHP/MysqlPHP Mysql et Access...
Plus de sujets relatifs à : [ MySQL] chaines de caractères : LEFT() / RIGHT()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR