Обновлять столбец "varchar2", только если найдена новая запись - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь разработать простой код для моего проекта.

Где я должен обновить таблицу books.PUBLISHER.Здесь, в столбце PUBLISHER у нас уже есть значения ниже 'abc; pqr', и я хочу обновить его до 'pqr; xyz', поэтому мой ожидаемый результат будет 'abc; pqr; xyz'.

update books SET PUBLISHER = PUBLISHER || '; ' ||'pqr; xyz'
where id = 1 and PUBLISHER  NOT LIKE '%pqr; xyz%';

Мой ожидаемый результат будет 'abc; pqr; xyz'.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Следующий оператор обновления должен выполнить эту работу:

update books b
   set publisher =
       (select listagg(publisher_part, '; ') within group(order by publisher_part)
          from (select regexp_substr(bb.publisher, '[a-z]+', 1, level) as publisher_part
                  from (select publisher from books where id = b.id) bb
                connect by regexp_substr(bb.publisher, '[a-z]+', 1, level) is not null
                union
                select 'lmn' as publisher_part --> your new "publisher" pattern
                  from dual))
 where id = 1; --> id to update

Внутренний выбор (select regexp...) разбрасывает ваш столбец издателя в отдельных результатах

abc
pqr
xyz
...

После этого новыйзначение lmn добавляется с помощью union select from dual, и, наконец, результат агрегируется в предыдущем формате с помощью listagg.

Лучшее решение, как уже рекомендовано APC, - нормализация вашей таблицы.

0 голосов
/ 05 февраля 2019

Ваше текущее значение publisher содержит строку pqr.Ваше требование показывает, что вы не хотите дублировать это значение.При добавлении предложенного вами решения дублируется значение pqr.

Вы можете избежать дублирования с помощью replace():

update books 
SET PUBLISHER = replace(PUBLISHER, 'pqr', 'pqr; xyz')
where id = 1 
and PUBLISHER  NOT LIKE '%pqr; xyz%';

Это заменит pqr; xyz везде, где появляется pqrв столбце publisher.

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