Как ОБНОВЛЯТЬ, используя REPLACE для разных шаблонов в одном и том же значении столбца в Oracle?

Вот пример данных того, что у меня есть в моем 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;

Как ОБНОВЛЯТЬ, используя REPLACE для разных шаблонов в одном и том же значении столбца в Oracle?

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

Как ОБНОВЛЯТЬ, используя REPLACE для разных шаблонов в одном и том же значении столбца в Oracle?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Вот еще более глупый прием (все еще правильный - он должен работать в 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
  )
/

Как вы пришли к двум ответам? Я не нашел ни одного !!! Не могли бы вы объяснить разницу между двумя ответами?

Reeya Oberoi 15.12.2018 03:52

Другие вопросы по теме