9

「支払い期限が {3} であるため、支払いができません{1}」というテーブルからの文字列があります。{2} {1} をある値に、{2} をある値に、{3} をある値に置き換えたい。

1つの置換機能で3つすべてを置換することは可能ですか? または、クエリを直接記述して置換値を取得する方法はありますか? これらの文字列を Oracle ストアド プロシージャで置き換えたい 元の文字列がテーブルの 1 つから来ている そのテーブルで選択を行っているところです

次に、その文字列の {1}、{2}、{3} の値を別のテーブルの別の値に置き換えたい

4

5 に答える 5

14

replace()1 つの呼び出しではありませんが、呼び出しをネストできます。

SET mycol = replace( replace(mycol, '{1}', 'myoneval'), '{2}', mytwoval)
于 2008-09-17T14:37:25.253 に答える
6

置換する変数が多数あり、それらが別のテーブルにあり、変数の数が可変である場合は、再帰 CTE を使用してそれらを置換できます。以下に例を示します。テーブル fg_rulez では、文字列を置換して配置します。テーブル fg_data には、入力文字列があります。

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

だから、単一のreplace.

結果:

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

変数の代わりの用語記号は、この重複した質問に由来します。

オラクル 11gR2

于 2015-02-18T13:19:07.880 に答える
1

置換する値の数が多すぎる場合、または簡単に維持できるようにする必要がある場合は、文字列を分割し、辞書テーブルを使用して、最終的に結果を集計することもできます

以下の例では、文字列内の単語が空白で区切られており、文字列内の単語数が 100 を超えないことを前提としています (ピボット テーブルのカーディナリティ)。

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
于 2016-02-15T09:30:55.787 に答える
-1

選択内でこれを行っている場合、置換値が列である場合は、文字列連結を使用して、それをつなぎ合わせることができます。

于 2008-09-17T14:41:17.103 に答える