[SQL] Masque "littéral"

Masque "littéral" [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 15-05-2006 à 11:51:43    

Salut,
 
J'ai un léger souci, je ne sais pas trop comment le résoudre simplement...
 
J'ai un champ qui contient par exemple :
 

OONN


 
Un second qui contient
 

_NO


 
Je veux comme résultat :
 

ONON


 
C'est à dire que je complète les trous du second avec les valeurs issues du premier, en respectant la position des caractères.
 
Je dois le faire en SQL directement (avec Oracle)
 
Je peux à la limite passer par une procédure PL/SQL, je me préfèrerais éviter...
 
Vous voyez une solution ?


Message édité par Arjuna le 15-05-2006 à 20:27:59
Reply

Marsh Posté le 15-05-2006 à 11:51:43   

Reply

Marsh Posté le 15-05-2006 à 11:53:08    

Note: ici, j'ai 4 caractères. Seulement, il peut y avoir un nombre "indéfini" de caractères.
Deplus, la second valeur peut être null (vous focalisez pas dessus, c'est pas un problème) ou de taille inférieure à la première (idem, c'est pas vraiment un problème, ça peut toujours se résoudre à coup de NVL() et RPAD()

Reply

Marsh Posté le 15-05-2006 à 12:56:31    

J'aime bien causer dans le vide moi :o
 
Bon, j'ai pondu ça, c'est pas top mais bon, c'est mieux que rien...

Code :
  1. create or replace function get_rights(v_codsoc tie.codsoc%type, v_typtie tie.typtie%type, v_sigtie tie.sigtie%type)
  2. return varchar2
  3. is
  4.    i number;
  5.    ret varchar2(30);
  6.  
  7.    a varchar2(30);
  8.    b varchar2(30);
  9.  
  10. begin
  11.    i := 0;
  12.    select tbl.lib2, rpad(nvl(wt_right.rights, ' '), length(tbl.lib2))
  13.    into a, b
  14.    from wt_right, tbl, tie
  15.    where tie.codsoc = v_codsoc
  16.    and tie.typtie = v_typtie
  17.    and tie.sigtie = v_sigtie
  18.    and tbl.codsoc = tie.codsoc
  19.    and tbl.codtbl = '102'
  20.    and tbl.cletbl = substr(tie.typtie || tie.famtie, 1, 6)
  21.    and wt_right.codsoc(+) = tie.codsoc
  22.    and wt_right.typtie(+) = tie.typtie
  23.    and wt_right.sigtie(+) = tie.sigtie;
  24.  
  25.    while i < length(a)
  26.    loop
  27.       i := i + 1;
  28.   if substr(b, i, 1) = ' ' then
  29.     ret := ret || substr(a, i, 1);
  30.   else
  31.     ret := ret || substr(b, i, 1);
  32.   end if;
  33.    end loop;
  34.  
  35.    return ret;
  36. end;


Message édité par Arjuna le 15-05-2006 à 12:56:44
Reply

Marsh Posté le 15-05-2006 à 15:48:09    

J'ai ça pour toi mais je suis pas sûr que cela répond exactement à tes besoins.
Je l'ai fait rapidement mais l'esprit est là :
 

Code :
  1. declare
  2. a varchar2(30);
  3. b varchar2(30);
  4. c varchar2(30);
  5. d varchar2(30);
  6. e varchar2(30);
  7. begin
  8. a := 'OONN';
  9. b := ' NO  ';
  10. c := lpad (ltrim(b), length(b), a);
  11. d := substr(a,length(rtrim(c))+1,length(c)-length(rtrim(c)));
  12. e := rpad (rtrim(c), length(c), d);
  13. dbms_output.put_line( 'C : '||c);
  14. dbms_output.put_line( 'D : '||d);
  15. dbms_output.put_line( 'E : '||e);
  16. end;

Reply

Marsh Posté le 15-05-2006 à 15:49:11    

tu peux le faire en SQL sans problème mais ca va pas être super lisible à mon avis

Reply

Marsh Posté le 15-05-2006 à 20:27:21    

j'ai pas bien compris ce que fait ton truc.
 
je testerai ça demain.

Reply

Sujets relatifs:

Leave a Replay

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