Question

J'ai une chaîne provenant d'une table du type "ne peut pas payer {1}, car votre paiement {2} est dû le {3}". Je souhaite remplacer {1} par une valeur, {2} par une valeur et {3} par une valeur.

Est-il possible de remplacer les 3 fonctions en une? ou est-ce que je peux écrire directement une requête et obtenir une valeur remplacée? Je souhaite remplacer ces chaînes dans la procédure stockée Oracle. La chaîne d'origine provient d'une de mes tables que je suis en train de sélectionner. Sélectionnez sur cette table

puis je souhaite remplacer {1}, {2}, {3} les valeurs de cette chaîne par l'autre valeur que j'ai dans une autre table

Était-ce utile?

La solution

Bien qu'il ne s'agisse pas d'un seul appel, vous pouvez imbriquer les appels replace () :

SET mycol = replace( replace(mycol, '{1}', 'myoneval'), '{2}', mytwoval)

Autres conseils

S'il y a beaucoup de variables à remplacer et que vous les avez dans une autre table, et si le nombre de variables est variable, vous pouvez utiliser un CTE récursif pour les remplacer. Un exemple ci-dessous. Dans la table fg_rulez, vous mettez les chaînes avec leur remplacement. Dans la table fg_data, vous avez vos chaînes d'entrée.

set define off;
drop table fg_rulez
create table fg_rulez as 
  select 1 id,'<' symbol, 'less than' text from dual
  union all select 2, '>', 'great than' from dual
  union all select 3, '

Donc, un seul remplacer .

Résultat:

amount dollars must be less than 1 and great than 2 
John is great than Peter and has many dollars 
Eliana is less than mary and do not  has many dollars

Le symbole de terminologie au lieu de variable provient de cette question dupliquée.

Oracle 11gR2

, 'dollars' from dual union all select 4, '&', 'and' from dual; drop table fg_data; create table fg_Data AS( SELECT 'amount $ must be < 1 & > 2' str FROM dual union all SELECT 'John is > Peter & has many

Donc, un seul remplacer .

Résultat:

<*>

Le symbole de terminologie au lieu de variable provient de cette question dupliquée.

Oracle 11gR2

str FROM dual union all SELECT 'Eliana is < mary & do not has many

Donc, un seul remplacer .

Résultat:

<*>

Le symbole de terminologie au lieu de variable provient de cette question dupliquée.

Oracle 11gR2

str FROM dual ); WITH q(str, id) as ( SELECT str, 0 id FROM fg_Data UNION ALL SELECT replace(q.str,symbol,text), fg_rulez.id FROM q JOIN fg_rulez ON q.id = fg_rulez.id - 1 ) SELECT str from q where id = (select max(id) from fg_rulez);

Donc, un seul remplacer .

Résultat:

<*>

Le symbole de terminologie au lieu de variable provient de cette question dupliquée.

Oracle 11gR2

Si le nombre de valeurs à remplacer est trop important ou si vous devez pouvoir le conserver facilement, vous pouvez également scinder la chaîne, utiliser une table de dictionnaire et enfin agréger les résultats

Dans l'exemple ci-dessous, je suppose que les mots de votre chaîne sont séparés par des espaces et que le nombre de mots dans la chaîne ne sera pas supérieur à 100 (cardinalité du tableau croisé dynamique)

with Dict as
 (select '{1}' String, 'myfirstval' Repl from dual
   union all
  select '{2}' String, 'mysecondval' Repl from dual
   union all
  select '{3}' String, 'mythirdval' Repl from dual
   union all  
  select '{Nth}' String, 'myNthval' Repl from dual  

 )
,MyStrings as
 (select 'This  is the first example {1} ' Str, 1 strnum from dual
  union all
  select 'In the Second example all values are shown {1} {2} {3} {Nth} ', 2  from dual
  union all
  select '{3} Is the value for the third', 3 from dual
  union all
  select '{Nth} Is the value for the Nth', 4 from dual  
  )
,pivot as (
  Select Rownum Pnum
  From dual
  Connect By Rownum <= 100   
  )
,StrtoRow as
(
SELECT rownum rn
      ,ms.strnum
      ,REGEXP_SUBSTR (Str,'[^ ]+',1,pv.pnum) TXT
  FROM MyStrings ms
      ,pivot pv
where REGEXP_SUBSTR (Str,'[^ ]+',1,pv.pnum) is not null
)
Select Listagg(NVL(Repl,TXT),' ') within group (order by rn) 
from
(
Select sr.TXT, d.Repl, sr.strnum, sr.rn
  from StrtoRow sr
      ,dict d
 where sr.TXT = d.String(+) 
order by strnum, rn 
) group by strnum

Écrivons le même exemple qu'un CTE uniquement:

with fg_rulez as (
  select 1 id,'<' symbol, 'less than' text from dual
  union all select 2, '>', 'greater than' from dual
   union all select 3, ', 'dollars' from dual
  union all select 4, '+', 'and' from dual
),  fg_Data AS (
   SELECT 'amount $ must be < 1 + > 2' str FROM dual
   union all
   SELECT 'John is > Peter + has many  str FROM dual
   union all
   SELECT 'Eliana is < mary + do not has many  str FROM dual
), q(str, id) as (
  SELECT str, 0 id 
  FROM fg_Data 
     UNION ALL
  SELECT replace(q.str,symbol,text), fg_rulez.id
  FROM q 
  JOIN fg_rulez 
    ON q.id = fg_rulez.id - 1
)
SELECT str from q where id = (select max(id) from fg_rulez);

Si vous faites cela dans une sélection, vous pouvez simplement l'assembler, si vos valeurs de remplacement sont des colonnes, à l'aide de la concaténation de chaînes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top