Вот пример данных того, что у меня есть в моем 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;
Я хочу написать заявление об обновлении, чтобы заменить текст соответствующим номером. Итак, результат должен быть таким -


Вот один способ. Это глупо, но проблема в том, так что я не чувствую себя слишком плохо. Это действительно работает.
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
)
/
Как вы пришли к двум ответам? Я не нашел ни одного !!! Не могли бы вы объяснить разницу между двумя ответами?