Concaténation complexe

Concaténation complexe - SQL/NoSQL - Programmation

Marsh Posté le 03-12-2020 à 09:43:44    

Bonjour a tous,
Jai besoin de concaténé 3 valeur ensemble mais c'est assez complexe, je m'explique:
J'ai 2 tables old_ref et new_ref.
Dans old_ref j'ai des références noté comme ce la 10854854R  elle est composé du premier caractère(1) qui est l'unité de production, la référence de l'article(0854854) et d'une extension qui varie(R,S,T) qui n'est pas toujours présente.  
Dans new_ref j'ai la référence qui ce trouve dans old_ref(0854854) ainsi que celle qui va la remplacer écrite comme ceci(10056263)
Mon but est de remplacer la référence(0854854) par la nouvelle(10056263) tout en garder l'unité et l'extension qui va avec.
j'avais pensé a:

Code :
  1. UPDATE old_ref old
  2. JOIN new_ref new ON substring(old.ref,2,8)=new.ref
  3. set old.ref= concat(substring(old.ref,1,1),new.new_ref, substring(old.ref,9,9))
  4. where substring (old..ref,2,8) = new.ref;


Malheureusement l'extension n'est pas récupéré, auriez vous une idée?
 
 

Reply

Marsh Posté le 03-12-2020 à 09:43:44   

Reply

Marsh Posté le 03-12-2020 à 19:18:36    

Je pense que tu devrais faire la jointure en faisant l'extraction de la référence via une regexp pour gérer le cas de la présence ou absence de la lettre de fin.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-12-2020 à 20:51:59    

Pourquoi ne pas concaténer :
concat(left(old.ref, 1),new.new_ref,right(old.ref, 1))
where length(old.ref) > 8

 

Puis dans un deuxième temps :
concat(left(old.ref, 1),new.new_ref)
where length(old.ref) < 9

 

EDIT : et je ne suis pas habitué mais tu as le case/when/else pour faire tout en un.


Message édité par MaybeEijOrNot le 03-12-2020 à 20:53:57

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 11-12-2020 à 17:50:01    

Bonjour,

 

On est face à un souci purement lié au nom respect de la seconde règle de Codd : https://fr.wikipedia.org/wiki/12_r%C3%A8gles_de_Codd

 

Dans votre table old_ref vous ne devriez pas avoir 1 colonne, mais 3 colonnes.
Rien ne vous empêche ensuite, si votre SGBD supporte des colonnes calculées d'en créer une
https://docs.microsoft.com/fr-fr/sq [...] rver-ver15

 

Ou si votre SGBD ne les supporte pas, vous pouvez créer une simple vue.

 

Pour ce qui est de votre requête, vous n'étiez pas loin.
En revanche, vu votre syntaxe, vous n'étiez visiblement pas sur SQL Server, moi je le suis : l'ordre des éléments de la requête varie un peu.

 

Je préfère partir sur du left() et right() ainsi que sur len() car on n'est pas absolument certains que la longueur du code est fixe (la preuve, votre nouveau code fait un caractère de plus)

 
Code :
  1. UPDATE o
  2. SET ref = concat(LEFT(o.ref, 1), n.ref, RIGHT(o.ref, 1))
  3. FROM old_ref o
  4. INNER JOIN new_ref n ON n.old = substring(o.ref, 2, len(o.ref) - 2);


Message édité par Arjuna le 11-12-2020 à 17:51:41
Reply

Marsh Posté le 02-06-2021 à 16:51:45    

Bonjour,
 
old..ref  , est ce que c'est une erreur de syntaxe ? ( dans la clause WHERE ).
 
Pour un UPDATE ,
tu peux utiliser l'ID  comme numéro trés trés précis pour être positionné sur le bon tuple.
( à un moment, il y aura 2 ( ou 20 ) références qui seront les mêmes , c'est source d'erreurs. )
 
Quand un champ est modifié, il est 'réécrit'.
tu peux former ta String , puis faire l'update.
C'est + maniable au niveau 'StringBuild' , et au niveau requête à passer aussi.
 
=
tu a vu que tu utilises 4 fois la fonction 'substring()' ?
 
les 'conventions de nommage' , c'est dur entre new.ref  ;  old_ref ; new_ref ;old.ref . . _ . _ _ .
 
et je vois bien le nom de table après ON ... comme source de bug ...
là, il faut hardcode ... NOM_new_REF ...
 
tu voulais faire une requete dynamique ? adaptable ?
 
 
comme décomposition :
1 requete SELECT ( pour ID cible , et les données à changer si besoin ) SELECT * FROM old_REF WHERE ... ref = the old_ref;
1 fonction qui crée la String; même si substring() est utilisé plusieurs fois , c'est fait pour ça.
1 requete UPDATE; ( la plus simple possible ). UPDATE new_ref SET ..aqw = valeur , zsx = valeur_2 ... WHERE ID(old)  =  old_ref.ID_oldref;
 
Avec l'ID de la référence , tu sera sur le bon directement.
 
Et , il s'agit de créer une table temporaire à chaque fois ?
 
https://www.w3schools.com/sql/sql_update.asp
 
 
les liaisons avec JOIN , c'est difficile ...
mais elles sont trés efficaces quand il faut retirer des résultats d'un SELECT.
pour trier d'avance. ( quelles valeurs sont communes, est ce que je les gardes , est ce que je les enleves , est ce que je veux que 'gauche' , que 'droite' ... )
 
 
pour lier avec une lecture ( et une écriture plus abordable .. )
SELECT * FROM table_un , table_deux , table_cinq WHERE table_un.ID = table_cinq.ID AND table_deux.ID = table_cinq ;
 
C'est les clés primaires ( ID ) , qui 'link' vers les autres tables , avec la même valeur ( ID égaux et clés étrangères ) pour que les données correspondent.
 
 
 
 
 
 
 
 


---------------
Nom : Prénom : Age : Adresse : Ville : Code Postal : Num Trois Tel
Reply

Sujets relatifs:

Leave a Replay

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