Как ОБНОВИТЬ, используя REPLACE на разных шаблонах в пределах одного значения столбца в Oracle? - PullRequest
0 голосов
/ 15 декабря 2018

Вот пример данных о том, что у меня есть в table FOO -

        CREATE TABLE FOO 
           ( 
            NUMBERS VARCHAR2(4000 CHAR)
           );

           INSERT INTO FOO VALUES ('One,Five,Seven');
           INSERT INTO FOO VALUES ('One,Two,Three');
           INSERT INTO FOO VALUES ('Five,Five,Seven');
           INSERT INTO FOO VALUES ('Zero,Five,Seven');
       /*  .
           .
           .
          and so on.. */

SELECT * FROM FOO;

the sample data

Я хочу написать заявление об обновлении взаменить текст на соответствующий номер.Таким образом, результат должен быть как -

Output

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вот еще более глупый хак (все еще правильно - он должен работать в Oracle 12.1 и выше).Это более интересно как иллюстрация того, что возможно.

update /*+ with_plsql */ foo
  set numbers = (
    with
      function list_replace(str varchar2) return varchar2 as
        p integer := instr(str,',');
        function single_replace(token varchar2) return varchar2 as
        begin
          return case token when 'Zero'  then '0' when 'One'   then '1'
                            when 'Two'   then '2' when 'Three' then '3'
                            when 'Four'  then '4' when 'Five'  then '5'
                            when 'Six'   then '6' when 'Seven' then '7'
                            when 'Eight' then '8' when 'Nine'  then '9' end;
        end single_replace;
      begin
        return case p when 0 then single_replace(str)
                      else single_replace(substr(str,1,p-1)) || ',' ||
                           list_replace(substr(str,p+1)) end;
      end list_replace;
    select list_replace(numbers) from dual
  )
/
0 голосов
/ 15 декабря 2018

Вот один из способов.Это глупо, но проблема в том, что я не чувствую себя слишком плохо.Это работает.

update foo
set numbers = (select listagg(decode(token,'Zero',0,'One',1,'Two',2,'Three',3,
                       'Four',4,'Five',5,'Six',6,'Seven',7,'Eight',8,'Nine',9)
                             , ',') within group (order by ord)
               from   json_table('["' || replace(numbers, ',', '","') || '"]',
                                 '$[*]'
                                 columns token varchar2 path '$', 
                                         ord for ordinality)
              )
;

select * from foo;

NUMBERS             
--------------------
1,5,7
1,2,3
5,5,7
0,5,7
...