Oracle Вставить значение в середину существующего значения - PullRequest
1 голос
/ 05 августа 2020

Это похоже на мой предыдущий вопрос. У меня есть следующие частичные номера в реестре:

docket_number
-------------
2012JV592
2016DR138
2018JV84

Если номер в реестре меньше 10 цифр, мне нужно вставить 0 после второй буквы, пока длина не станет 10 цифр. Обновленные номера учетных записей будут выглядеть следующим образом.

docket_number
-------------
2012JV0592
2016DR0138
2018JV0084

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Вы можете разделить данные на три части: di git группа1, группа букв и di git группа2, используя функции regexp_substr() и функцию lpad(), чтобы добавить нули непосредственно перед вторым di git, а затем объедините их напрямую с помощью операторов ||, предполагая, что у вас одна и та же модель данных для всей таблицы,

UPDATE t
   SET docket_number = regexp_substr(docket_number,'[[:digit:]]+')||
                       regexp_substr(docket_number,'[[:alpha:]]+')||
                       lpad('0',10-length(docket_number),'0')||
                       regexp_substr(docket_number,'[[:digit:]]+$')

Demo

1 голос
/ 05 августа 2020

Одним из вариантов может быть

  • разделение docket_number на две части: первая часть содержит цифры и буквы, вторая содержит конечный номер
  • результатом является объединение первой части и вторая часть слева заполнена нулями до общей длины 10 символов
SQL> with test (docket_number) as
  2    (select '2012JV592' from dual union all
  3     select '2016DR138' from dual union all
  4     select '2018JV84'  from dual
  5    ),
  6  temp as
  7    (select docket_number,
  8         regexp_substr(docket_number, '[[:digit:]]+[[:alpha:]]+') part1,
  9         regexp_substr(docket_number, '[[:digit:]]+$') part2
 10     from test
 11    )
 12  select case when length(docket_number) < 10 then
 13              part1 || lpad(part2, 10 - length(part1), '0')
 14              else docket_number
 15         end result
 16  from temp;

RESULT
--------------------------------------------------------------------------------
2012JV0592
2016DR0138
2018JV0084

SQL>

Как обновить строки в таблице? Используя такой SELECT в UPDATE, например

SQL> select * from test;

DOCKET_NUM
----------
2012JV592
2016DR138
2018JV84

SQL> update test a set
  2    a.docket_number =
  3      (with temp as
  4        (select b.docket_number,
  5              regexp_substr(b.docket_number, '[[:digit:]]+[[:alpha:]]+') part1,
  6              regexp_substr(b.docket_number, '[[:digit:]]+$') part2
  7         from test b
  8        )
  9       select case when length(t.docket_number) < 10 then
 10                        t.part1 || lpad(t.part2, 10 - length(t.part1), '0')
 11              else docket_number
 12              end
 13       from temp t
 14       where t.docket_number = a.docket_number
 15      );

3 rows updated.

SQL> select * from test;

DOCKET_NUM
----------
2012JV0592
2016DR0138
2018JV0084

SQL>
0 голосов
/ 07 августа 2020

Это тот случай, когда ваш docket_number всегда должен следовать формату 4 цифры (год?), За которыми следуют 2 буквы, за которыми следуют 4 цифры. Тогда достаточно простой подстроки docket_number и последующей повторной конкатенации.

select docket_number
     , substr(docket_number,1,6) || lpad(nvl(substr(docket_number,7),'0'),4,'0')  
  from test_dn 
 where length(docket_number) < 10
 order by docket_number;

and for update: 
update test_dn
   set docket_number = substr(docket_number,1,6) || lpad(nvl(substr(docket_number,7),'0'),4,'0')
 where length(docket_number) < 10; 

Если формат верен, то, в зависимости от размера таблицы, это может быть значительно быстрее, поскольку регулярные выражения относительно медленны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...