Frage

Ich habe eine Zeichenfolge aus einer Tabelle kommen wie „kann nicht {1} bezahlen, als Ihre Zahlung {2} aufgrund auf {3}“. Ich mag ersetzen {1} mit einem gewissen Wert, {2} mit einem gewissen Wert und {3} mit einem gewissen Wert.

Ist es möglich, alle drei in eine solche ersetzen Funktion ersetzen? oder ist es eine Möglichkeit, direkt Abfrage schreiben und ersetzt Wert erhalten? Ich mag die ursprüngliche Zeichenfolge diese Strings in Oracle gespeicherte Prozedur ersetzen ist von einem meines Tisch kommt ich nur wählen Sie auf dieser Tabelle tue

und dann möchte ich ersetzen {1}, {2} {3} Werte aus dieser Zeichenfolge auf den anderen Wert, den ich aus einer anderen Tabelle haben

War es hilfreich?

Lösung

Auch wenn es nicht ein Anruf ist, können Sie nisten die replace() Anrufe:

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

Andere Tipps

Wenn es gibt viele Variablen zu ersetzen, und Sie müssen sie in einer anderen Tabelle und wenn die Anzahl der Variablen ist variabel Sie einen rekursiven CTE verwenden können, sie zu ersetzen. Ein Beispiel unten. In Tabelle fg_rulez setzen Sie die Saiten mit deren Ersatz. In Tabelle fg_data Sie Ihre Eingabe-Strings.

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, '$', '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 $' str FROM dual
   union all
   SELECT 'Eliana is < mary & do not has many $' 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);

So ein einzelner replace.

Ergebnis:

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

Die Terminologie Symbol statt Variable kommt von diese duplizierte Frage.

Oracle 11gR2

Wenn die Anzahl der Werte zu ersetzen, ist zu groß oder Sie müssen in der Lage sein, leicht zu pflegen, können Sie auch die Zeichenfolge aufgeteilt könnten, eine Wörterbuch Tabelle verwenden und aggregieren schließlich die Ergebnisse

Im Beispiel unten Ich gehe davon aus, dass die Worte in der Zeichenfolge getrennt sind mit blankspaces und die wordcount in der Zeichenfolge nicht größer sein als 100 (Pivot-Tabelle Mächtigkeit)

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

Lassen Sie uns die gleiche Probe als CTE nur schreiben:

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

Wenn Sie diese innerhalb einer ausgewählten tun, können Sie es nur Stück zusammen, wenn Ihre Wiederbeschaffungswerte Spalten sind, String-Verkettung verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top