Как мне добавить значение в поле без стирания и повторения?

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

Итак, это то, что у меня есть. Например, поле содержит шесть букв:

 A, B, C, D, E, F
  

ОК. Теперь я хочу обновить это поле и добавить букву G . Я могу использовать этот скрипт:

 declare
   v_c pls_integer;
   v_s varchar(7) := 'LETTERS';
begin
   select 1 into v_c from some_table where lower(some_column_name) = lower(v_s);
   if (v_c = 1) then
      execute immediate 'update some_table set values = ''A,B,C,D,E,F,G''
         where lower(some_column_name) = lower('''||v_s||''')';
      commit;
   end if;
end;
/
  

Но мне нужно проверить. Это поле может уже содержать некоторые буквы. Возможно, эта буква уже есть в этом списке. Например, буква C . Если буква уже существует, не добавляйте ее. Если такой буквы нет, просто добавьте ее в конец (через запятую). Как я могу это сделать?

Комментарии:

1. Что делать, если у вас есть A,B,C,F , и вам нужно добавить E ?

2. Просто добавьте в конец..

3. ну .. нужно сказать — это плохая нормализация. вы могли бы легко сделать это с помощью уникального ограничения и простых вставок, если они будут правильно нормализованы.

4. Да, я согласен) Но это то, что существует сейчас.

Ответ №1:

Я думаю, что вам просто нужно другое условие в предложении where:

 where ',' || values || ',' not like '%,' || v_s || ',%'
  

Ответ №2:

Самый простой способ — просто добавить его в список существующих букв.

Настройка

 CREATE TABLE test_letters
(
    letters    VARCHAR2 (50)
);

insert into test_letters
SELECT 'A, B, C, D' AS letters FROM DUAL
UNION ALL
SELECT 'A, B, C, D, E, F' AS letters FROM DUAL;
  

Обновить

 UPDATE test_letters
   SET letters = letters || ', G'
 WHERE letters not like '%G%';
  

Ответ №3:

Другим вариантом является функция INSTR, которая может работать лучше, чем LIKE или Reg exp .

 update test_letters
   set letters = letters || ', G'
 where instr(letters,'G') = 0;